OpenGL 顶点着色器处理
OpenGL vertex shader processing
我对 3D 编程还很陌生。我正在尝试从 this site. During the reading I couldn't really understand how the layout (location = 0)
line really operates. I've tried to search for other explanation online both in the OpenGL wiki and in other sites, and I've managed to find this 站点学习 OpenGL,我从中了解更多。
所以如果我是正确的顶点着色器接受一些输入并生成一些输出。着色器的输入称为顶点属性,每个属性作为一个索引位置称为属性索引。现在我希望如果着色器将单个顶点及其属性作为输入,它必须 运行 多次,一个用于我要渲染的对象的每个顶点。
到目前为止我写的内容是否正确?
现在,我没能理解的是 layout (location = 0)
是如何工作的。我的假设是这个指令需要告诉着色器从内存中的哪个位置选择第一个索引属性。因此每次着色器 re-运行s(如果它实际上 re-运行s),位置应该移动一个单位,就像在正常的 for 循环中一样。这种解释正确吗?并且,请问有人能以有机的方式实际向我解释顶点着色器是如何运行的吗?
P.S。预先感谢您的宝贵时间,请原谅我糟糕的英语:我还在练习!
编辑
这是代码。按照我链接的第一个指南,我创建了一个顶点数组:
float vertices[] {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
然后我创建了一个顶点缓冲对象:
unsigned int VBO;
glGenBuffer(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
我将数据添加到 VBO:
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
而顶点着色器读取:
#version 330 core
layout (location = 0) in vec3 aPos:
void main() {
gl_Position(aPos.x, aPos.y, aPos.z, 1.0f);
}
你需要从两方面来看。您绑定一个包含所有数据的缓冲区。说位置和颜色。
layout(location = 0) in vec3 position;
layout(location = 1) in vec3 color;
现在在程序中,我可以使用这些向量而无需指定我正在处理的顶点的索引,因为我们必须告诉 GL 如何缓冲数据。
我们在将缓冲区绑定到程序时会这样做。
假设我们要创建一个三角形。它有3个顶点,每个顶点有两个属性:颜色和位置。我们创建了一个处理每个顶点的顶点着色器,在该程序中暗示每个顶点都有一个颜色和位置。您不关心数组中的索引(现在)。
程序将获取顶点i、v_i并对其进行处理。它如何填充位置和向量取决于您如何绑定数据。我可以有两个数组,
positionData = [x0, y0, z0, x1, ... z3];
colorData = [r0, g0, b0, r1, ... b3];
所以我会缓冲这个数据,然后我会将该缓冲区绑定到属性位置的程序并指定它是如何读取的。例如。将 positionBuffer 绑定到属性位置 0,以三个步幅读取它,没有偏移量。
与颜色数据相同,但位置为 1。
或者我也可以。
posColData = [ x0, y0, z0, r0, g0, b0, x1, y1, ... b3];
然后我将创建 posColBuffer 并将其绑定到第 0 个属性,步幅为 6。我还将 posColBuffer 绑定到第一个属性,步幅为 6,偏移量为 3。
您使用的代码在此处执行此操作。
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0); ;
他们通过说 0
来利用布局子句,因为他们知道位置。
我对 3D 编程还很陌生。我正在尝试从 this site. During the reading I couldn't really understand how the layout (location = 0)
line really operates. I've tried to search for other explanation online both in the OpenGL wiki and in other sites, and I've managed to find this 站点学习 OpenGL,我从中了解更多。
所以如果我是正确的顶点着色器接受一些输入并生成一些输出。着色器的输入称为顶点属性,每个属性作为一个索引位置称为属性索引。现在我希望如果着色器将单个顶点及其属性作为输入,它必须 运行 多次,一个用于我要渲染的对象的每个顶点。 到目前为止我写的内容是否正确?
现在,我没能理解的是 layout (location = 0)
是如何工作的。我的假设是这个指令需要告诉着色器从内存中的哪个位置选择第一个索引属性。因此每次着色器 re-运行s(如果它实际上 re-运行s),位置应该移动一个单位,就像在正常的 for 循环中一样。这种解释正确吗?并且,请问有人能以有机的方式实际向我解释顶点着色器是如何运行的吗?
P.S。预先感谢您的宝贵时间,请原谅我糟糕的英语:我还在练习!
编辑
这是代码。按照我链接的第一个指南,我创建了一个顶点数组:
float vertices[] {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
然后我创建了一个顶点缓冲对象:
unsigned int VBO;
glGenBuffer(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
我将数据添加到 VBO:
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
而顶点着色器读取:
#version 330 core
layout (location = 0) in vec3 aPos:
void main() {
gl_Position(aPos.x, aPos.y, aPos.z, 1.0f);
}
你需要从两方面来看。您绑定一个包含所有数据的缓冲区。说位置和颜色。
layout(location = 0) in vec3 position;
layout(location = 1) in vec3 color;
现在在程序中,我可以使用这些向量而无需指定我正在处理的顶点的索引,因为我们必须告诉 GL 如何缓冲数据。
我们在将缓冲区绑定到程序时会这样做。
假设我们要创建一个三角形。它有3个顶点,每个顶点有两个属性:颜色和位置。我们创建了一个处理每个顶点的顶点着色器,在该程序中暗示每个顶点都有一个颜色和位置。您不关心数组中的索引(现在)。
程序将获取顶点i、v_i并对其进行处理。它如何填充位置和向量取决于您如何绑定数据。我可以有两个数组,
positionData = [x0, y0, z0, x1, ... z3];
colorData = [r0, g0, b0, r1, ... b3];
所以我会缓冲这个数据,然后我会将该缓冲区绑定到属性位置的程序并指定它是如何读取的。例如。将 positionBuffer 绑定到属性位置 0,以三个步幅读取它,没有偏移量。
与颜色数据相同,但位置为 1。
或者我也可以。
posColData = [ x0, y0, z0, r0, g0, b0, x1, y1, ... b3];
然后我将创建 posColBuffer 并将其绑定到第 0 个属性,步幅为 6。我还将 posColBuffer 绑定到第一个属性,步幅为 6,偏移量为 3。
您使用的代码在此处执行此操作。
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0); ;
他们通过说 0
来利用布局子句,因为他们知道位置。