Несколько целей рендеринга в DX9 - PullRequest
1 голос
/ 09 июля 2009

Я установил

m_lpD3DDevice->SetRenderTarget(0,Buffer1);
m_lpD3DDevice->SetRenderTarget(1,Buffer2);
m_lpD3DDevice->SetRenderTarget(2,Buffer2);

и если я отрисовываю пиксель, он влияет только на первую цель рендеринга.

Это структура вывода

struct PS_OUTPUT
{
    float4 Color0    :  COLOR0;
    float4 Color1    :  COLOR1;
    float4 Color2    :  COLOR2;
};

что мне нужно сделать, чтобы повлиять на две другие цели рендеринга?

Ответы [ 3 ]

1 голос
/ 15 июля 2009

Для каждой цели есть отдельная цветовая маска записи. Маска записи по умолчанию для цели 0 - 0xf (все каналы включены), но по умолчанию для других целей - 0x0. Переопределить это в файле эффектов можно одним способом (хотя вы хотели включить альфу?) Или вы можете изменить его с помощью SetRenderState. См. Документацию для состояний D3DRS_COLORWRITEENABLE {1,2,3}.

1 голос
/ 09 июля 2009

В вашем пиксельном шейдере убедитесь, что вы возвращаете структуру, а не float4. Также не привязывайте семантику COLOR0 к сигнатуре функции, то есть не делайте этого:

PS_OUTPUT myPS(VS_OUTPUT): COLOR0

Я думаю, что это поможет, но это может запутать компилятор. Простой шейдер MRT выглядит так:

PS_OUTPUT myPS(VS_OUTPUT)
{
    PS_OUTPUT out;
    out.color0 = float4(0.5,0.5,0.5,1.0);
    out.color1 = float4(0.2,0.5,0.8,1.0);
    out.color2 = float4(0.8,0.5,0.2,1.0);
    return out;
}

Что такое буфер 0, 1 и 2? Являются ли они результатом вызова CreateTexture ()? (точнее поверхность из этой текстуры). Если это так, убедитесь, что текстура была создана с флагом использования цели рендеринга: D3DUSAGE_RENDERTARGET.

Убедитесь, что ваша карта поддерживает рендеринг более чем на одну RT. (забыл, как это сделать - но я сомневаюсь, что это не поддержит их.)

Если вы правильно создали буферы, правильно их установили и правильно выводите правильные значения из пиксельного шейдера, то я не вижу, что может пойти не так. Что говорит PIX * о MRTS? Написаны ли им добрые дела, и что их отображение идет не так?

ps: Вы, надеюсь, сделали колл, верно? :)

* PIX - это приложение в DirectX SDK. Если вы не использовали его раньше, вы действительно пропускаете:)

0 голосов
/ 10 июля 2009

Теперь у меня наконец есть ответ. Все, что мне нужно было сделать, это установить

ColorWriteEnable = red | green | blue;

в файле эффекта. Все остальное было правильно. Но я не знаю, почему это заставило это работать.

...