Wraith
> Короче - смотри дизасм своего шейдера, вдумчиво читай документацию про
> инструкции и просветляйся.
Может для начала ему фифектов будет достаточно ? Чисто по имени ставятся
Дык в структуре тоже "чисто по имени ставится". Прямо там же в ашнике со структурой можно сделать
struct S1 { float4x4 worldViewProj; float4x4 invWorld; ... }; #define S1_REG 42
и юзать и в шейдере
#include "paramstructs.h" S1 params : register(S1_REG);
и в цопопе:
S1 params; params.worldViewProj = object->matrix * pass->view * pass->proj; params.invWorld = inverse( object->matrix ); ... device->SetxxxShaderConstantF( S1_REG, (float*) ¶ms, sizeof(params)/16 );
Дело остановилось, сижу гадаю что происходит этом случае:
IDirect3DVertexShader9* vs; /*...создание vs */ device->SetVertexShader(vs); // Рисую некий меш device->SetVertexShader( vs); // Рисую некий меш device->SetVertexShader( vs); // Рисую некий меш device->SetVertexShader( vs); // и т.д.
Директ оптимизирует это дело? Не упадёт производительность от потоянной установки одного и того же шейдера?
Я не дурак и понимаю что можно раз установить и рисовать, рисовать, рисовать. Но архитектурка меш дллки просит сокрытия деталей(использ. шейдеров)
Скорее всего, может и незначительно, но упадёт. У меня в ДХ11 падало, хотя он гораздо "дешевле" в этом плане, чем ДХ9.
То есть упадёт всё же из-за директовских внутренних делишек, а не из-за "просто моногократные вызовы функций". Спасибо подозрения подусилились, буду рассматривать у себя иные варианты сокрытия шейдеров.
Жаберштуцер
Ну ты просто текущий шейдер установленный шейдер держи и сранивай что пришел. Если совпали не ставь повторно, а вот измененные константы засылай не зависимо от шейдера.
Andrey
Очевидный и простой вариант! Но есть у меня идея разбить сетки на группы по типу используемого шейдера и рисовать сразу всю группу раз установив. Скелет набросал, но углубляться не буду пока не пойму оптимизацию по типу "Рисуй только то что видишь". А там сортировка как раз, так что думаю синхронно нужно всё делать - "сетки" и "фрустум". В математику пока ушёл. Я сторонник быстрого получения результата, чтоб по минимуму но было готово. От мелкой dll до клиента - так фатальные косяки замечаются сразу и не требуют большого труда на исправление
А не подскажет ли, кто то, есть ли где готовая библиотека примеров шейдеров на HLSL, интересен шейдер для картонных эффектов, типа таких.
Dark
В гугле забанили?
"cartoon shader hlsl"
Dark
> есть ли где готовая библиотека примеров шейдеров на HLSL
http://developer.download.nvidia.com/shaderlibrary/webpages/shader_library.html
Жаберштуцер
> Директ оптимизирует это дело? Не упадёт производительность от потоянной
> установки одного и того же шейдера?
у мну на 9-ом вообще проблем с этим не было, отрисовка >1500 калов, но, возможно тут зависит от драйвера, возможно он сам определяет и оптимизирует, дривер был NVIDIA.
На msdn написано следующие:
SV_Depth Depth buffer data. Can be written or read by any shader.
В пиксельном шейдере действительно можно получить текущую глубину? Или они ошиблись?
Я больше нигде не видел инфы, что можно получить текущую глубину в шейдере, да еще и в любом шейдере o_0.
Везде пишут, что надо тексутру глубины использовать как SRV или копировать ее в свою текстуру.
WISHMASTER35
SV_Depth это только аутпут.
Возможно в данной фразе имеется ввиду, что ты можешь делать так:
float depth : SV_DEPTH;
depth = x; // запись в переменную
depth = foo(depth); // чтение из переменной и запись в переменную
Executor
> Возможно в данной фразе имеется ввиду, что ты можешь делать так:
> float depth : SV_DEPTH;
> depth = x; // запись в переменную
Тогда это для всех семантик подходит. А any shader тогда как объяснить? Видно они все же ошиблись.
Есть еще вопрос. Обычно константы пишутся внутри cbuffer. Но не редко вижу как константы (например матрицы) объявляются и без cbuffer. В чем разница?
WISHMASTER35
> Есть еще вопрос. Обычно константы пишутся внутри cbuffer. Но не редко вижу как
> константы (например матрицы) объявляются и без cbuffer. В чем разница?
в первом случае ты сам определяешь сколько тебе надо константых буферов => ты можешь регулировать их частоту обновлений для оптимизаций.
во втором за тебя это сделает компилятор шейдера загнав все константы в один cbuffer. он будет один