来自此顶点着色器的数据在哪里?

时间:2012-03-14 21:14:39

标签: glsl opengl-es-2.0 vertex-shader

我正在尝试学习Open GL ES 2.0的GLSL。我已经查看了教程,但是在解释中显然缺少一些东西,因为它完全没有意义。请参考下面的代码。这是从官方的OpenGL ES 2.0参考卡中删除的。

这应该是顶点着色器。

uniform mat4 mvp_matrix; // model-view-projection matrix
uniform mat3 normal_matrix; // normal matrix
uniform vec3 ec_light_dir; // light direction in eye coords
attribute vec4 a_vertex; // vertex position
attribute vec3 a_normal; // vertex normal
attribute vec2 a_texcoord; // texture coordinates
varying float v_diffuse;
varying vec2 v_texcoord;

void main(void)
{
   // put vertex normal into eye coords
   vec3 ec_normal = normalize(normal_matrix * a_normal);
   // emit diffuse scale factor, texcoord, and position
   v_diffuse = max(dot(ec_light_dir, ec_normal), 0.0);
   v_texcoord = a_texcoord;
   gl_Position = mvp_matrix * a_vertex;
}

问题1:没有任何内容被初始化。在开始时列出了8个变量/对象,而没有一个被初始化。所以我们有8个空变量/对象。

问题2:使用之前的8个空变量/对象初始化初始化的变量/对象。很好,所以现在一切都是空的......

问题3:没有任何东西传递出来。如何遮挡任何东西都超出了我的范围,它不需要任何东西,也没有任何结果。它触及的唯一可能产生影响的是gl_Position,它显然是某种特殊的输出变量。但它只取决于mvp_matrix和a_vertex所以其他的东西是什么?

这不仅仅是这个例子,它是迄今为止我找到的所有人。我不明白如何声明一堆变量,而不是使用大多数变量,然后在整个地方传递/分配空对象可以做任何事情。

1 个答案:

答案 0 :(得分:3)

您假设着色器的行为与常规C代码相同,但事实并非如此。顶点着色器有两种类型的输入:属性和制服,以及一种输出:变化。这是在着色器代码顶部定义的内容。属性是每个顶点数据,它们对于每个顶点是不同的。所有顶点的制服都是一样的。初始化属性和制服是在应用程序的主渲染方法中的其他地方完成的。在这里,会有很多电话,如:

// set up the position attribute
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vertices);

着色器的输出是变化v_diffusev_texcoord。这些输出的值在所有渲染的片段着色器中进行插值,用于照亮片段。

gl_Position变量是一个特殊输出,用于设置顶点的位置。

对于这个例子来说有意义,你还需要查看执行渲染的主循环和片段着色器,它们都绑在一起。