Как нарисовать изнутри геометрию света в отложенном затенении

Я пытаюсь реализовать отложенный шейдер с OpenGL и GLSL, и у меня проблемы с геометрией освещения. Вот шаги, которые я предпринимаю:

Bind multitarget framebuffer
Render color, position, normal and depth
Unbind framebuffer
Enable blend
Disable depth testing
Render every light
Enable depth testing
Disable blend
Render to screen

Но так как я рендую только переднюю грань, когда я нахожусь внутри источника света, он полностью исчезает, рендеринг задней грани не работает, так как я получу удвоенную силу света (А когда внутри, половина [или нормальное количество]).

Как я могу отобразить одно и то же значение света изнутри и снаружи геометрии света?

2 ответа

Решение

Если я правильно помню, в моем отложенном рендере я просто рендеринг только задних граней светового объема. Недостатком является то, что вы не можете проверить глубину, вы будете знать только, находится ли источник света за геометрией после того, как будет выполнен расчет света, и отбросить пиксель. Как объяснил другой ответ, вы можете провести глубинное тестирование. Проверьте на большее или равное, чтобы увидеть, находится ли задняя поверхность позади или на геометрии, поэтому пересекается с поверхностью геометрии.

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

Хорошо в моем случае, я делаю это так:

Bind gbuffer framebuffer
Render color, position, normal
Unbind framebuffer

Enable blend
Enable depth testing

glDepthMask(0);
glCullFace(GL_FRONT);   //to render only backfaces
glDepthFunc(GL_GEQUAL); //to test if light fragment is "behind geometry", or it shouldn't affect it
Bind light framebuffer
Blit depth from gbuffer to light framebuffer //so you can depth-test light volumes against geometry
Render every light
Другие вопросы по тегам