OpenGL红宝书Triangles程序-通过shader添加顶点颜色

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

计划为Triangles添加不同的颜色,像mspaint的颜色选取布一样:

1. 已知

我们已知:

  1. fragment shader中是可以做到逐个像素的颜色修改;
    ​​​​​​​2. vertex shader是对顶点的处理,也可以添加输出颜色,光栅化的时候颜色会被插值成各像素的颜色。

2. 实现

那我们主要利用vertex shader对顶点赋予颜色,在fragment shader中选取插值后的颜色。

代码参考如下:vi triangles.vert (vertex shader)

#version 400 core
layout( location = 0 ) in vec4 vPosition;
out vec4 fColor;
void
main()
{
    gl_Position = vPosition;
    switch(gl_VertexID % 3)
    {   
        case 0:
            fColor = vec4(1.0, 0.0, 0.0, 1.0);
            break;
        case 1:
            fColor = vec4(0.0, 1.0, 0.0, 1.0);
            break;
        case 2:
            fColor = vec4(0.0, 0.0, 1.0, 1.0);
            break;
    };  
}

代码参考如下:vi triangles.frag (fragment shader)

#version 400 core

in vec4 fColor;
out vec4 vColor;

void main()
{
    vColor = fColor;
}

3. 过程中遇到的问题

执行时异常:
Shader linking failed: WARNING: Output of vertex shader ‘vColor’ not read by fragment shader
ERROR: Input of fragment shader ‘vInColor’ not written by vertex shader

原因在于:
vertex shader中定义的输出名称采用了vColor,fragment shader中定义的输入名称采用了vInColor,名称不匹配
从而导致了link时,发现
a. vertex shader中输出的vColor未被fragment shader 使用
b. fragment shader中使用的vInColor在vertex shader中未写入

问题发生的原因:
一开始我认为两个main程序,它们应该是互相独立的,fragment shader输入的是对应像素离散插值后的数值, 对于名称可能是通过参数顺序来传递对应的值的。
通过发生的错误,认识到:它们是通过同名参数来传递值的,离散插值后的值也是通过同名参数传递的。

问题的解决:
把vertex shader的输出参数与fragment shader的输入参数名称对应起来。
vertex shader输出color名称采用fColor,fragment shader的输入color名称采用fColor。正如第二节中代码实现的那样。

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

你可能感兴趣的:(OpenGL,OpenGL)