如何使用 glVertexAttribPointer() 添加非数组值
How to add non-array value using glVertexAttribPointer()
我知道有 uniforms
可以解决这个问题,但我想知道是否可以使用 glVertexAttribPointer()
添加像 int
这样的值?
着色器:
#version 330 core
layout (location = 0) in vec3 aPosition;
layout (location = 1) in vec3 aColor;
layout (location = 2) in int aSize;
out vec3 vColor;
void main()
{
gl_Position = vec4(aPosition, 1.0f);
gl_PointSize = aSize;
vColor = aColor;
}
代码:
makeCurrent();
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, points.vbo.size() * sizeof(GLfloat), &points.vbo.front(), GL_STATIC_DRAW); //look below to the struct
glVertexAttribPointer(0, points.vertexAmount, GL_FLOAT, GL_FALSE, points.stride * sizeof(GLfloat), (GLvoid *)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, points.colorAmount, GL_FLOAT, GL_FALSE, points.stride * sizeof(GLfloat), (GLvoid *)(points.vertexAmount * sizeof(GLfloat)));
glEnableVertexAttribArray(1);
glVertexAttribPointer(/* ??? how to add simple int here ??? */);
glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
doneCurrent();
points
结构:
struct RenderedObjects
{
std::vector<float> vbo;
int vertexAmount = 3;
int colorAmount = 3;
int stride = vertexAmount + colorAmount;
int size = 1;
} points;
glVertexAttribPointer
仅适用于数据数组。当您发出 dasw 调用时,GPU 将获取每个启用的属性数组的第 i
个元素,并使用顶点属性指针数据在 VBO 中查找该元素。
对于没有启用属性数组的属性输入,您可以将值设置为 GL 状态的一部分。函数族 glVertexAttib...()
允许您设置通用顶点属性的值。
OpenGL 的命名约定在这里可能会有点混乱。默认情况下,顶点属性始终被视为浮点数,即使您将输入指定为整数(与 glVertexAttribPointer()
s 类型参数相同)。因此,即使您可能认为 glVertexAttrib1i()
可能会设置一个标量整数属性的值,但实际上它只是通过提供一个整数值来设置 float
属性。
稍后添加到 GL 的整数属性,您必须使用 glVertexAttribI()
/ glVertexAttribIPointer()
(注意大写的 I 字母)。
所以为 layout (location = 2) in int aSize;
指定单个常量输入的正确方法是:
glVertexAttribI1i(2, yourIntegerValue);
glDisableVertexAttribArray(2); // do NOT use an array for this attribute
(创建 VAO 时,所有属性数组最初都是禁用的,因此您可能不需要在此处显式调用 glDisableVertexAttribArray(2)
。)
我知道有 uniforms
可以解决这个问题,但我想知道是否可以使用 glVertexAttribPointer()
添加像 int
这样的值?
着色器:
#version 330 core
layout (location = 0) in vec3 aPosition;
layout (location = 1) in vec3 aColor;
layout (location = 2) in int aSize;
out vec3 vColor;
void main()
{
gl_Position = vec4(aPosition, 1.0f);
gl_PointSize = aSize;
vColor = aColor;
}
代码:
makeCurrent();
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, points.vbo.size() * sizeof(GLfloat), &points.vbo.front(), GL_STATIC_DRAW); //look below to the struct
glVertexAttribPointer(0, points.vertexAmount, GL_FLOAT, GL_FALSE, points.stride * sizeof(GLfloat), (GLvoid *)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, points.colorAmount, GL_FLOAT, GL_FALSE, points.stride * sizeof(GLfloat), (GLvoid *)(points.vertexAmount * sizeof(GLfloat)));
glEnableVertexAttribArray(1);
glVertexAttribPointer(/* ??? how to add simple int here ??? */);
glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
doneCurrent();
points
结构:
struct RenderedObjects
{
std::vector<float> vbo;
int vertexAmount = 3;
int colorAmount = 3;
int stride = vertexAmount + colorAmount;
int size = 1;
} points;
glVertexAttribPointer
仅适用于数据数组。当您发出 dasw 调用时,GPU 将获取每个启用的属性数组的第 i
个元素,并使用顶点属性指针数据在 VBO 中查找该元素。
对于没有启用属性数组的属性输入,您可以将值设置为 GL 状态的一部分。函数族 glVertexAttib...()
允许您设置通用顶点属性的值。
OpenGL 的命名约定在这里可能会有点混乱。默认情况下,顶点属性始终被视为浮点数,即使您将输入指定为整数(与 glVertexAttribPointer()
s 类型参数相同)。因此,即使您可能认为 glVertexAttrib1i()
可能会设置一个标量整数属性的值,但实际上它只是通过提供一个整数值来设置 float
属性。
稍后添加到 GL 的整数属性,您必须使用 glVertexAttribI()
/ glVertexAttribIPointer()
(注意大写的 I 字母)。
所以为 layout (location = 2) in int aSize;
指定单个常量输入的正确方法是:
glVertexAttribI1i(2, yourIntegerValue);
glDisableVertexAttribArray(2); // do NOT use an array for this attribute
(创建 VAO 时,所有属性数组最初都是禁用的,因此您可能不需要在此处显式调用 glDisableVertexAttribArray(2)
。)