c++ - OpenglES 2.0 顶点着色器属性

标签 c++ opengl-es shader vertex

我在教程中读到,顶点着色器需要的最低限度定义如下:

attribute vec3 v3_variable;
attribute vec3 v3Pos;

void main()
{
    gl_Position = v3Pos;
}

OpenglES将着色器顶点数据传递给v3Pos,但这个变量的名称实际上可以是任何名称,其他教程将其命名为a_Positiona_Pos >,随便吧~。

所以我的问题是,OpenglES 如何知道当我调用 glVertexAttribPointer() 时,它知道应该将该数据放入 v3Pos 而不是 v3_variable

最佳答案

有两种方法可以识别着色器中的哪些属性与您提供给 glVertexAttribPointer 的数据“配对”。使用 glVertexAttribPointer 获得的唯一标识符是 index (第一个参数),因此它必须以某种方式通过索引完成。

在第一种方法中,在使用 glGetAttribLocation 编译和链接着色器后,您可以从着色器获取属性的索引。 ,并将其用作第一个参数,例如。

GLint program = ...;
GLint v3PosAttributeIndex = glGetAttribLocation(program, "v3Pos");
GLint v3varAttributeIndex = glGetAttribLocation(program, "v3_variable");
glVertexAttribPointer(v3PosAttributeIndex, ...);
glVertexAttribPointer(v3varAttributeIndex, ...);

您还可以在创作着色器时显式设置属性的布局(如 @j-p 的评论所建议的),因此您可以像这样修改着色器:

layout(location = 1) in vec3 v3_variable;
layout(location = 0) in vec3 v3Pos;

然后在代码中明确设置它们:

glVertexAttribPointer(0, ...); // v3Pos data
glVertexAttribPointer(1, ...); // v3_variable data

第二种方法仅适用于 GLES 3.0+(和 OpenGL 3.0+),因此如果您仅使用 GLES 2.0,则它可能不适用于您的情况。另请注意,您可以同时使用这两种方法。例如。即使您显式定义布局,它也不会限制您稍后查询它们。

关于c++ - OpenglES 2.0 顶点着色器属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30531729/

相关文章:

iOS OpenGL ES 多次加载同一对象时崩溃

c++ - glsl 错误 : "v_color" not declared as an output from the previous stage while trying to render wtih tesselation shaders

c++ - 链接到集群上的 GNU 科学图书馆?

iphone - 如何在 iOS 中使用 OpenGL ES 2.0 绘制矩形?

c++ - 找到所有整数 i, j, k >= 0 使得 i + j + k <= d?

android - OpenGL ES 2.0 PNG alpha channel

c++ - 着色器输入布局无效

directx - 修改HLSL中的全局texture3d变量

c++ - 将未知结构(在运行时)作为模板参数传递

C++基础模板题