2012-03-14 99 views
0

我正试图学习OpenGL 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,所以其他的东西是什么?

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

+0

“我环顾教程”真的吗?哪个?是的,所有的GLSL代码*看起来像这样,但代码周围还有*文本*,它解释了“属性”,“统一”和“变化”都意味着什么。如果代码中不存在这样的文本,那么您没有找到教程。你找到了一个*代码示例*,这完全是另一回事。教程解释,代码示例只是代码。 – 2012-03-14 21:38:27

回答

3

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

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

输出到着色器是varyings v_diffusev_texcoord。这些输出的值在所有渲染的片段着色器中被内插,用于点亮片段。

gl_Position变量是设置顶点位置的特殊输出。

对于这个例子来说是有道理的,你还需要看看做主渲染和片段着色器的主循环,它们全部绑在一起。

+2

你能清理这篇文章的语法吗? – 2012-03-14 21:38:59

+0

你不喜欢哪个位?对我来说没问题。或者你是指我的病态不喜欢大写字母? – Tark 2012-03-15 09:17:26

+1

-1:我不喜欢你的病态不喜欢大写字母。 – Lordalcol 2012-03-27 11:31:28