opengl - 如何获取片段的当前颜色?

标签 opengl shader glsl fragment-shader

我正在尝试了解 GLSL 中的着色器,并且找到了一些有用的资源和教程,但我一直在为一些应该是基本且琐碎的事情而碰壁:我的片段着色器如何检索当前片段的颜色?

您可以通过说gl_FragColor =whatever来设置最终颜色,但显然这是一个仅输出值。如何获得输入的原始颜色以便对其进行计算?它必须在某个变量中,但如果有人知道它的名字,他们似乎没有在我到目前为止遇到的任何教程或文档中记录它,这让我抓狂。

最佳答案

片段着色器接收 gl_Colorgl_SecondaryColor 作为顶点属性。它还获取四个可以写入值的变量:gl_FrontColorgl_FrontSecondaryColorgl_BackColorgl_BackSecondaryColor。如果你想直接传递原始颜色,你可以这样做:

gl_FrontColor = gl_Color;
gl_FrontSecondaryColor = gl_SecondaryColor;
gl_BackColor = gl_Color;
gl_BackSecondaryColor = gl_SecondaryColor;

顶点着色器之后的管道中的固定功能会将它们限制在范围 [0..1] 内,并确定顶点是朝前还是朝后。然后它将像往常一样插入所选的(正面或背面)颜色。然后,片段着色器将接收选定的、固定的、插值的颜色作为 gl_Colorgl_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/

相关文章:

java - OpenGL正确实现多种 Material

java - OpenGL ES 2.0 : glGetAttribLocation returns -1. 着色器优化?

c++ - 顶点着色器后的 OpenGL 三角形退化?

c++ - 平行于向上 vector 转换阴影时的 LookAt 矩阵

c++ - 将 uint 传递给着色器会更改其值

opengl - GLSL-将属性绑定(bind)到语义

ios - 为什么在 iOS Metal 中旋转这个棱镜不能正确渲染?

我可以在我的 C 程序中使用 OpenGL 进行图形处理吗?

Java:缓冲区实用程序?

使用 GL_TEXTURE_2D 的 iOS YUV 420v 在 OpenGL 着色器中显示错误的颜色