我正在尝试了解 GLSL 中的着色器,并且找到了一些有用的资源和教程,但我一直在为一些应该是基本且琐碎的事情而碰壁:我的片段着色器如何检索当前片段的颜色?
您可以通过说gl_FragColor =whatever
来设置最终颜色,但显然这是一个仅输出值。如何获得输入的原始颜色以便对其进行计算?它必须在某个变量中,但如果有人知道它的名字,他们似乎没有在我到目前为止遇到的任何教程或文档中记录它,这让我抓狂。
最佳答案
片段着色器接收 gl_Color
和 gl_SecondaryColor
作为顶点属性。它还获取四个可以写入值的变量:gl_FrontColor
、gl_FrontSecondaryColor
、gl_BackColor
和 gl_BackSecondaryColor
。如果你想直接传递原始颜色,你可以这样做:
gl_FrontColor = gl_Color;
gl_FrontSecondaryColor = gl_SecondaryColor;
gl_BackColor = gl_Color;
gl_BackSecondaryColor = gl_SecondaryColor;
顶点着色器之后的管道中的固定功能会将它们限制在范围 [0..1] 内,并确定顶点是朝前还是朝后。然后它将像往常一样插入所选的(正面或背面)颜色。然后,片段着色器将接收选定的、固定的、插值的颜色作为 gl_Color
和 gl_SecondaryColor
。
例如,如果您绘制了标准的“死亡三角形”,如下所示:
glBegin(GL_TRIANGLES);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(-1.0f, 0.0f, -1.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(1.0f, 0.0f, -1.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3d(0.0, -1.0, -1.0);
glEnd();
然后是这样的顶点着色器:
void main(void) {
gl_Position = ftransform();
gl_FrontColor = gl_Color;
}
使用像这样的片段着色器:
void main() {
gl_FragColor = gl_Color;
}
将传输颜色,就像您使用固定功能管道一样。
关于opengl - 如何获取片段的当前颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2740874/