如何在延迟着色中从灯光几何图形的内部绘制

Posted

技术标签:

【中文标题】如何在延迟着色中从灯光几何图形的内部绘制【英文标题】:How to draw from the inside of the light geometry in deferred shading 【发布时间】:2013-01-19 09:52:06 【问题描述】:

我正在尝试使用 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

但由于我只渲染正面,当我在灯光内部时,它会完全消失,渲染背面不起作用,因为我会获得双倍的光功率(当在里面时,一半 [或正常数量])。

如何从光照几何体的内部和外部渲染相同的光照值?

【问题讨论】:

"用 glAccum 累加" ...为什么会这样? @NicolBolas 我......不知道......没有它之前它是行不通的,我想我以前没有使用过混合。我将从问题中删除。 您可能应该包括模板测试,以从光体积中排除没有渲染几何图形的区域。 @fscan 我该怎么做? 在渲染几何体时将模板设置为 1,将 blit depth/stencil 设置为光缓冲区,仅在模板为 1 的情况下渲染 lightvolumes。 【参考方案1】:

就我而言,我就是这样做的:

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

【讨论】:

【参考方案2】:

如果我没记错的话,在我的延迟渲染器中,我只渲染光量的背面。 缺点是不能进行深度测试,只有在光照计算完成后才能知道光照是否在几何体后面并丢弃像素。 正如另一个答案所解释的,您可以进行深度测试。测试大于或等于以查看背面是在几何体的后面还是在几何体上,因此与几何体的表面相交。

或者,您可以在渲染时检查您是否在光量内并相应地切换正面。

【讨论】:

只渲染背面有效,但是如果我在光照几何体中,在多次光照之后,我的 fps 会下降到一半,这有关系吗? 试试模板技巧,如果你在光照几何体内部,你会渲染整个屏幕。

以上是关于如何在延迟着色中从灯光几何图形的内部绘制的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中从csv绘制图形

顶点着色器的绘制操作

视觉基础篇14 # 如何使用片元着色器进行几何造型?

如何在 gnuplot 上绘制树/图形/网络数据?

DirectX11 With Windows SDK--16 利用几何着色器可选的流输出阶段帮助绘制多种分形

在绘图中从底部到图形留出空间