RnM*_*Mss 21 opengl shader glsl
在一个简单的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;
}
Run Code Online (Sandbox Code Playgroud)
其中的属性aVertex和aColor来自一个顶点缓冲,通过调用传递glVertexAttribPointer.
片段着色器:
varying vec4 vColor;
void main(void) {
gl_FragColor = vColor;
}
Run Code Online (Sandbox Code Playgroud)
三角形仍然充满了渐变,这里有一个问题:
如果每个顶点计算顶点着色器,vColor则应为每个实例分配顶点的颜色.并且顶点颜色应该是红色,绿色或蓝色,如顶点缓冲区中设置的那样.
那么渐变来自哪里?
或者,换句话说,什么时候发生在碎片着色器中,vColor结果是插值颜色而不是顶点?
joz*_*yqk 17
片段着色器中的"变化"变量具有在顶点着色器阶段给出的值之间线性插值的结果(基于顶点之间的片段的相对位置).
也就是说,当光栅化器在像素处吐出片段时,其位置也相对于重心坐标中的三角形顶点给出.然后使用这些坐标来插入来自顶点着色器的所有变化变量.在大多数情况下,这就是你想要的,而且从非插值中获得的速度现在非常微不足道.
使用关键字"flat"将禁用插值,而是使用第一个顶点的值(我不是100%肯定"平面"随着我改用使用更新版本的GLSL的输入/输出关键字而变化) .
另外,如果片段需要来自每个顶点的一些值,我发现这特别有用.在这种情况下,我flat out myVertexValue[3]在几何着色器中使用(例如这里).