在一个简单的hello-world OpenGL程序中,该程序只需在窗口上绘制一个静态三角形,
当我将三角形的3个顶点设置为红色,绿色和蓝色时,三角形将充满渐变。
但是当我使用这样的着色器时:
顶点着色器:
attribute vec4 aVertex;
attribute vec4 aColor;
varying vec4 vColor;
void main(void) {
gl_Position = gl_ModelViewMatrix * gl_ProjectionMatrix * aVertex;
vColor = aColor;
}
其中
aVertex
和aColor
属性来自顶点缓冲区,通过调用glVertexAttribPointer
传递。片段着色器:
varying vec4 vColor;
void main(void) {
gl_FragColor = vColor;
}
三角形仍然充满渐变,下面是问题:
如果按每个顶点计算顶点着色器,则应为
vColor
的每个实例分配一个顶点的颜色。顶点颜色应为红色,绿色或蓝色,如在顶点缓冲区中设置的那样。那么,梯度来自哪里?
或者,换句话说,什么时候发生在碎片着色器中,
vColor
变成了插值的颜色而不是顶点的颜色?
最佳答案
片段着色器中的“变量”变量具有在顶点着色器阶段给出的值之间线性插值的结果(基于片段在顶点之间的相对位置)。
即,当光栅化器在一个像素处吐出一个片段时,其位置也相对于重心坐标中的三角形顶点给出。然后,这些坐标用于从顶点着色器内插所有变化的变量。在大多数情况下,这就是您想要的,并且如今不插值所获得的速度已微不足道。
使用关键字“flat”将禁用插值,而是使用第一个顶点的值(我不是100%确信“flat”可以随着变化而工作,因为我已切换为对newer versions of GLSL使用in / out关键字)。
附带一提,如果片段需要每个顶点中的一些值,我发现这特别有用。在这种情况下,我在几何着色器(for example here)中使用了flat out myVertexValue[3]
。
关于opengl - 顶点着色器如何将颜色信息传递给片段着色器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18253785/