Добрый день.
Подскажите пожалуйста как задействовать несколько шейдеров подряд. Язык HLSL.
Пробовал так:
technique tech0
{
pass pass0
{
PixelShader = compile ps_1_0 brightnessUp();
}
pass pass1
{
PixelShader = compile ps_1_0 brightnessDown();
}
}
В итоге метод ID3DXEffect::Begin возвращает, что необходимое число проходов — 2, делаю их по схеме:
effect_->Begin(&passes, 0);
for(pass = 0; pass < passes; ++pass)
{
effect_->BeginPass(pass);
device_->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, ...));
effect_->EndPass();
}
effect_->End();
Но в результате — изображение, подвергнутое изменениям только последнего шейдера.
Спасибо.
Здравствуйте, devline, Вы писали:
D>Но в результате — изображение, подвергнутое изменениям только последнего шейдера.
Я не слишком хорошо разбираюсь в директовых материалах, но судя по всему вы вторым проходом просто перетираете первый. Хотя на мой взгляд должен отображатся результат первого прохода, т.к. второй сокрее всего не пройдёт z-buffer тест, если у вас включена запись в этот буфер, и приавльно настроена для вывода геометрии...
Не совсем понятно что вы хотели/ожидали увидеть на экране?

Если вы хотите что бы ваши два прохода каким-то образом смешались/совместились, то вам надо наеврное блендинг включить и настроить?
Здравствуйте, Phoenics, Вы писали:
P>Я не слишком хорошо разбираюсь в директовых материалах, но судя по всему вы вторым проходом просто перетираете первый. Хотя на мой взгляд должен отображатся результат первого прохода, т.к. второй сокрее всего не пройдёт z-buffer тест, если у вас включена запись в этот буфер, и приавльно настроена для вывода геометрии...
Z-buffer не используется вообще.
P>Не совсем понятно что вы хотели/ожидали увидеть на экране?
Если вы хотите что бы ваши два прохода каким-то образом смешались/совместились, то вам надо наеврное блендинг включить и настроить?
Мне блендинг не нужен. Можно ли сделать так, чтобы выходные данные одного шейдера пошли на вход другого? Например, у меня есть три пиксельных шейдера invert, brightness, blur и соответствующие им pass`ы pass0, pass1, pass2. Если я выполняю только первый и третий pass, то на выходе — изображение с инвертированными цветами и повышенной яркостью, если я выполняю все три, то изображение ещё и моется ко всему.
Спасибо.
Здравствуйте, Аноним, Вы писали:
А>Можно ли сделать так, чтобы выходные данные одного шейдера пошли на вход другого? Например, у меня есть три пиксельных шейдера invert, brightness, blur и соответствующие им pass`ы pass0, pass1, pass2. Если я выполняю только первый и третий pass, то на выходе — изображение с инвертированными цветами и повышенной яркостью, если я выполняю все три, то изображение ещё и моется ко всему.
А>Спасибо.
Да можно сделать так что бы данные из одного шейдера попали в другой. Для этого нужно установить render target — и производить рендеринг в текстуру. Т.е. суть в том что сначала вы рисуете первый проход invert не сразу в буфер цвета, а в текстуру. Затем во втором проходе brightness вы снова устанавлиаете рендер таргет в текстуру (не знаю можно ли в директе и вашем случае использовать туже самую что и в первом проходе), но текстур от первого прохода использьзуете как обычную текстуру (даннеы для шейдера). И наконец в третьем проходе blur вы уже производите рендеринг в буфер цвета, но текстур получившуюся после прохода brightness используете как обычную текстуру. Так работают большиснтво многопроходных техник и фильтров
Здравствуйте, Phoenics, Вы писали:
P>Да можно сделать так что бы данные из одного шейдера попали в другой. Для этого нужно установить render target — и производить рендеринг в текстуру. Т.е. суть в том что сначала вы рисуете первый проход invert не сразу в буфер цвета, а в текстуру. Затем во втором проходе brightness вы снова устанавлиаете рендер таргет в текстуру (не знаю можно ли в директе и вашем случае использовать туже самую что и в первом проходе), но текстур от первого прохода использьзуете как обычную текстуру (даннеы для шейдера). И наконец в третьем проходе blur вы уже производите рендеринг в буфер цвета, но текстур получившуюся после прохода brightness используете как обычную текстуру. Так работают большиснтво многопроходных техник и фильтров
Спасибо. Всё получилось, как Вы написали.