赞
踩
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
计划为Triangles添加不同的颜色,像mspaint的颜色选取布一样:
我们已知:
那我们主要利用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;
}
执行时异常:
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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。