Вопрос по шейдерам
От: devline  
Дата: 08.04.08 11:17
Оценка:
Добрый день.
Подскажите пожалуйста как задействовать несколько шейдеров подряд. Язык 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();

Но в результате — изображение, подвергнутое изменениям только последнего шейдера.

Спасибо.
Re: Вопрос по шейдерам
От: Phoenics Россия https://sourceforge.net/projects/phengine
Дата: 08.04.08 11:56
Оценка:
Здравствуйте, devline, Вы писали:

D>Но в результате — изображение, подвергнутое изменениям только последнего шейдера.


Я не слишком хорошо разбираюсь в директовых материалах, но судя по всему вы вторым проходом просто перетираете первый. Хотя на мой взгляд должен отображатся результат первого прохода, т.к. второй сокрее всего не пройдёт z-buffer тест, если у вас включена запись в этот буфер, и приавльно настроена для вывода геометрии...
Не совсем понятно что вы хотели/ожидали увидеть на экране? Если вы хотите что бы ваши два прохода каким-то образом смешались/совместились, то вам надо наеврное блендинг включить и настроить?
---=== С наилучшими пожеланиями, Phoenics ===---
_
Re[2]: Вопрос по шейдерам
От: Аноним  
Дата: 09.04.08 06:01
Оценка:
Здравствуйте, Phoenics, Вы писали:

P>Я не слишком хорошо разбираюсь в директовых материалах, но судя по всему вы вторым проходом просто перетираете первый. Хотя на мой взгляд должен отображатся результат первого прохода, т.к. второй сокрее всего не пройдёт z-buffer тест, если у вас включена запись в этот буфер, и приавльно настроена для вывода геометрии...

Z-buffer не используется вообще.
P>Не совсем понятно что вы хотели/ожидали увидеть на экране? Если вы хотите что бы ваши два прохода каким-то образом смешались/совместились, то вам надо наеврное блендинг включить и настроить?
Мне блендинг не нужен. Можно ли сделать так, чтобы выходные данные одного шейдера пошли на вход другого? Например, у меня есть три пиксельных шейдера invert, brightness, blur и соответствующие им pass`ы pass0, pass1, pass2. Если я выполняю только первый и третий pass, то на выходе — изображение с инвертированными цветами и повышенной яркостью, если я выполняю все три, то изображение ещё и моется ко всему.

Спасибо.
Re[3]: Вопрос по шейдерам
От: Phoenics Россия https://sourceforge.net/projects/phengine
Дата: 09.04.08 10:30
Оценка: 2 (1)
Здравствуйте, Аноним, Вы писали:

А>Можно ли сделать так, чтобы выходные данные одного шейдера пошли на вход другого? Например, у меня есть три пиксельных шейдера invert, brightness, blur и соответствующие им pass`ы pass0, pass1, pass2. Если я выполняю только первый и третий pass, то на выходе — изображение с инвертированными цветами и повышенной яркостью, если я выполняю все три, то изображение ещё и моется ко всему.


А>Спасибо.


Да можно сделать так что бы данные из одного шейдера попали в другой. Для этого нужно установить render target — и производить рендеринг в текстуру. Т.е. суть в том что сначала вы рисуете первый проход invert не сразу в буфер цвета, а в текстуру. Затем во втором проходе brightness вы снова устанавлиаете рендер таргет в текстуру (не знаю можно ли в директе и вашем случае использовать туже самую что и в первом проходе), но текстур от первого прохода использьзуете как обычную текстуру (даннеы для шейдера). И наконец в третьем проходе blur вы уже производите рендеринг в буфер цвета, но текстур получившуюся после прохода brightness используете как обычную текстуру. Так работают большиснтво многопроходных техник и фильтров
---=== С наилучшими пожеланиями, Phoenics ===---
_
Re[4]: Вопрос по шейдерам
От: devline  
Дата: 09.04.08 14:28
Оценка:
Здравствуйте, Phoenics, Вы писали:

P>Да можно сделать так что бы данные из одного шейдера попали в другой. Для этого нужно установить render target — и производить рендеринг в текстуру. Т.е. суть в том что сначала вы рисуете первый проход invert не сразу в буфер цвета, а в текстуру. Затем во втором проходе brightness вы снова устанавлиаете рендер таргет в текстуру (не знаю можно ли в директе и вашем случае использовать туже самую что и в первом проходе), но текстур от первого прохода использьзуете как обычную текстуру (даннеы для шейдера). И наконец в третьем проходе blur вы уже производите рендеринг в буфер цвета, но текстур получившуюся после прохода brightness используете как обычную текстуру. Так работают большиснтво многопроходных техник и фильтров


Спасибо. Всё получилось, как Вы написали.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.