opengl - 顶点着色器如何将颜色信息传递给片段着色器?

标签 opengl glsl shader

在一个简单的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;
}

其中aVertexaColor属性来自顶点缓冲区,通过调用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/

相关文章:

c++ - 如何创建纹理坐标

android - GLSL 2D 旋转不起作用

c++ - Opengl GSL glUniform4fv 颜色不起作用

unity-game-engine - 将 GLSL Shadertoy 着色器移植到 Unity 时出现问题

iphone - OpenGL ES 2.0 顶点光照

C++ 成员函数指针用例?

c++ - 虚拟机中的OpenGL问题

c# - WPF 中的 OpenGL 控件因 OOM 异常而崩溃

android - 如何在 Android 上加速着色器加载/编译

javascript - View 向量与法线之间的 Angular ?