2015-11-03 43 views
9

所以我一直在学习一些OpenGL,它需要很多东西,我只是一个初学者,但我不明白GLSL中的“布局限定符”。OpenGL:布局限定符?

因此,像这样:

layout (location = 0) in vec3 position; 
在一个简单的顶点着色器

像这样:

#version 330 core 
layout (location = 0) in vec3 position; // The position variable has attribute position 0 

out vec4 vertexColor; // Specify a color output to the fragment shader 

void main() 
{ 
    gl_Position = vec4(position, 1.0); // See how we directly give a vec3 to vec4's constructor 
    vertexColor = vec4(0.5f, 0.0f, 0.0f, 1.0f); // Set the output variable to a dark-red color 
} 

我理解为实例进行vec4(因为多数民众赞成将片段着色器)。例如,vertexColor是有意义的。

但也许我不理解“位置”,究竟这意味着什么?有人关心解释吗? opengl wiki诚实地没有帮助我。

但也许我误解了一个顶点着色器(当然,我仍然有点不确定的管道)。但从我的理解来看,顶点规范是我们所做的第一件事情呢? (如果需要,顶点/索引)并将它们存储到VAO中。

那么顶点着色器是与每个单独的顶点交互? (我希望),因为这是我的理解?

回答

9

你说得对,顶点着色器是为每个顶点执行的。

顶点由一个或多个属性(位置,法线,纹理坐标等)组成。

在当你创建VAO在CPU方面,你这样描述每种属性“这个数据在这个缓冲将属性0,它旁边的数据将属性1等”。请注意,VAO只存储谁在哪里的信息。实际的顶点数据存储在VBO中。

在顶点着色器中,包含布局和位置的行只是说“获取属性0并将其放入一个名为position的变量”中(位置表示属性的编号)。

如果这两个步骤都做得正确,你应该在一个名为位置的变量:)它是更清晰的位置结束了?

+1

那么,为什么你会使用什么,但为零? – msmith1114

+1

那么如果你有例如位置和法线,您可以在属性0和法线属性1位置,你不能把两者在属性0 – Jerem

+0

啊是有道理的,或者属性0类似的位置,和颜色1或类似的东西。 – msmith1114