Glsl 此顶点着色器中的数据来自何处?

Glsl 此顶点着色器中的数据来自何处?,glsl,opengl-es-2.0,vertex-shader,Glsl,Opengl Es 2.0,Vertex Shader,我正在尝试为OpenGLES2.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 direct

我正在尝试为OpenGLES2.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_位置,它显然是某种特殊的输出变量。但它只取决于mvp_矩阵和一个_顶点,那么所有其他的东西是用来做什么的呢


这不仅仅是这个例子,也是我迄今为止发现的所有例子。我不明白如何声明一组变量,不使用其中的大多数,然后到处传递/分配空对象可以做任何事情。

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

// set up the position attribute
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vertices);
着色器的输出是varyings
v_diffuse
v_texcoord
。这些输出的值跨所有渲染片段着色器进行插值,以用于照亮片段

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


为了使这个示例有意义,您还需要查看执行渲染的主循环和片段着色器,它们都是绑定在一起的。

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

// set up the position attribute
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vertices);
着色器的输出是varyings
v_diffuse
v_texcoord
。这些输出的值跨所有渲染片段着色器进行插值,以用于照亮片段

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


为了让这个示例有意义,您还需要查看执行渲染的主循环和片段着色器,它们都绑定在一起。

“我已经查看了教程”真的吗?哪一个?是的,所有GLSL代码看起来都是这样的,但代码周围也有文本,解释了
属性
统一
变化
的含义和作用。如果代码周围没有这样的文本,那么您就找不到教程。您发现了一个代码示例,这完全是另一回事。教程解释道,代码示例只是代码。“我看过教程”真的吗?哪一个?是的,所有GLSL代码看起来都是这样的,但代码周围也有文本,解释了
属性
统一
变化
的含义和作用。如果代码周围没有这样的文本,那么您就找不到教程。您发现了一个代码示例,这完全是另一回事。教程解释说,代码示例只是代码。请你整理一下这篇文章的语法好吗?你不喜欢哪一部分?我觉得没问题。或者你是指我病态地讨厌大写字母?请你整理一下这篇文章的语法好吗?你不喜欢哪一部分?我觉得没问题。还是说我病态地讨厌大写字母?