【发布时间】:2012-08-04 14:00:45
【问题描述】:
在阅读 OpenGL SuperBible 时,我在理解最基本(平面)着色器示例中的一行时遇到了一些问题。
在第 6 章的清单 6.4 和 6.5 中,它介绍了以下两个非常基本的着色器。
6.4 顶点着色器:
// Flat Shader
// Vertex Shader
// Richard S. Wright Jr.
// OpenGL SuperBible
#version 130
// Transformation Matrix
uniform mat4 mvpMatrix;
// Incoming per vertex
in vec4 vVertex;
void main(void)
{
// This is pretty much it, transform the geometry
gl_Position = mvpMatrix * vVertex;
}
6.5 片段着色器:
// Flat Shader
// Fragment Shader
// Richard S. Wright Jr.
// OpenGL SuperBible
#version 130
// Make geometry solid
uniform vec4 vColorValue;
// Output fragment color
out vec4 vFragColor;
void main(void)
{
gl_FragColor = vColorValue;
}
我的困惑是它在 out 声明中说 vFragColor 而在 main() 中说 gl_FragColor。
另一方面,在网站的代码中,它已被更正为“vFragColor = vColorValue;”在主循环中。
我的问题是,除了书中的错字之外,命名 out 着色器值的规则是什么?他们必须遵循特定的名称吗?
在 OpenGL.org 上,我发现 gl_Position 是 out of the vertex shader 所必需的。 片段着色器有没有这样的东西?或者只是如果只有一个输出,那么它将是缓冲区中的颜色?
当片段着色器中有多个时会发生什么? GLSL 编译器如何知道在缓冲区中使用哪一个?
【问题讨论】:
-
这看起来像是着色器中的一个简单错误。一个错误。
-
那么在这个文件的历史上,最终版本是没有bug的吗?印刷书籍中的版本似乎不存在于代码修订系统中。 code.google.com/p/oglsuperbible5/source/browse/trunk/Src/…
标签: opengl glsl shader fragment-shader vertex-shader