当前位置:   article > 正文

OpenGL红宝书Triangles程序-通过shader添加顶点颜色_fragment shader中设多个点色

fragment 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;
    };  
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

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

#version 400 core

in vec4 fColor;
out vec4 vColor;

void main()
{
    vColor = fColor;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/105010
推荐阅读
相关标签
  

闽ICP备14008679号