Direct3D 9 Режим наложения теней - PullRequest
0 голосов
/ 05 мая 2011

В настоящее время я пытаюсь нарисовать тени на сцене в direct3d 9. Я пытаюсь сделать несколько проходов рендеринга, и у меня возникают проблемы с пониманием, как использовать / установить режим наложения.

Я сделалпроход глубины, который заполняет буфер глубины, и тогда у меня есть цикл, который проходит через все источники света в сцене.В этом цикле у меня есть 2 петли, которые оба перебирают все фигуры в сцене

У меня есть такие настройки

for(number of shapes)
{
  //render from camera position and fill depth buffer
}
for(number of lights)
{
  for(number of shapes)
  {
    //render to shadow map
  }
  for(number of shapes)
  {
    //render to screen
  }
}

В пикселе я вижу, что он проходит через каждый светно когда я запускаю его, отображается только последний источник света в массиве источников света.Я думаю, что это как-то связано с режимом наложения.

Я посмотрел на режим наложения и нашел информацию об исходной и целевой смеси.Это то, что мне нужно / может кто-нибудь помочь объяснить это, пожалуйста?

Заранее спасибо,

Марк

[ РЕДАКТИРОВАТЬ ] Я получил оба источника света видимымииспользуя следующий код

hr = device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
hr = device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
hr = device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);

Тени выглядят неправильно, но я приближаюсь к желаемому результату.

Любой другой совет был бы отличным,

Спасибо,

Марка

1 Ответ

1 голос
/ 05 мая 2011

Я также думаю, что у вас установлены неправильные альфа-смешанные состояния. Я предполагаю, что вы делаете смешивание SRC и заменяете старое изображение новым, а не смешиваете альфа. Вы должны думать о том, что вы хотите. Я предполагаю, что вы хотите смешивание SRC_OVER.
Правила Porter Duff могут дать вам подсказку, и их очень легко реализовать в DirectX. Для примера посмотрите здесь .
[Редактировать] Я должен прочитать более внимательно.

Альфа-смешение и пиксельные шейдеры независимы. Так что вы, конечно, можете использовать пиксельный шейдер для изменения значения цвета вашего источника. Может быть, добавить какой-то особый эффект или что-то, что вы хотите попробовать. Но как только вы захотите смешать ваш источник с местом назначения и не хотите заменять все пиксели новыми, вам нужно включить альфа-смешивание. Например. как это

hr = device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
hr = device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
hr = device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

Этот код будет умножать все исходные пиксели на их альфа-значение и все конечные пиксели на 1-source_alpha. И объединить их в новое место назначения.

...