从未由着色器处理的位置照亮基元

Posted

技术标签:

【中文标题】从未由着色器处理的位置照亮基元【英文标题】:Lighting Primitives From Positions That Aren't Processed By Shaders 【发布时间】:2014-01-16 22:31:09 【问题描述】:

我有一个计算漫反射光照值的着色器。它由一个顶点和一个片段着色器组成,用于计算每个顶点的光照强度。但是,正如预期的那样,如果我有一个较大的GL_TRIANGLE,其灯光位置位于三角形中心上方,则应该照亮它的灯光不会出现,因为灯光值是在三角形表面上平滑插值的基于顶点计算。

所以我的问题是——一个图元如何在一个顶点以外的位置被光源照亮?

【问题讨论】:

【参考方案1】:

当您在顶点处进行光照时,您是在进行 Phong 光照,它在顶点处计算颜色,然后仅对在顶点处计算的颜色(即 Gouraud 着色)进行插值图元中的所有像素。如果您要计算每个像素的照明颜色,您会得到 Phong shading。鉴于您的场景,如果您将光照计算从顶点着色器移至片段着色器,并在图元中插入法线,您应该会得到更好的结果。

如果您将顶点法线设为可变变量并在片段着色器中对其进行归一化,然后进行光照计算,您应该会得到更好的结果。

【讨论】:

以上是关于从未由着色器处理的位置照亮基元的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL片段着色器不照亮场景

OpenGL学习随笔-- 顶点着色器(VertexShader)

如果未绑定,统一值是不是保留在 GLSL 着色器中?

着色器的简单理解

在 GLSL 顶点着色器中,您可以访问索引缓冲区中顶点的索引,而不仅仅是顶点缓冲区吗?

顶点着色器 -> 几何着色器,错误“获取非活动制服的位置”