Opengl es 对一个着色器中的不同属性使用不同的GL_元素_数组_缓冲区?
在OpenGL(OpenGL ES 2.0)中,我可以为不同的GL\U数组缓冲区使用多个GL\U元素\U数组\U缓冲区吗?我正在阅读“OpenGL ES 2.0编程指南”,第6章“顶点属性、数组和缓冲区对象”,有一个源示例:有几个GL_数组缓冲区(用于位置、法线、纹理坐标)和一个GL_元素数组缓冲区(“用于存储元素索引”) 当我写这个问题的时候,我发现我不能将一个以上的索引数组发送给gldrawerelements,所以如果我使用缓冲区,可能只有最后一个绑定的GL\u元素数组\u缓冲区用于绘图。但是关于内存保存(GLD元素的用途是什么)?我将说明我面临的问题 有2个数组(作为GL_数组_缓冲区)-8个顶点和6个法线Opengl es 对一个着色器中的不同属性使用不同的GL_元素_数组_缓冲区?,opengl-es,opengl-es-2.0,Opengl Es,Opengl Es 2.0,在OpenGL(OpenGL ES 2.0)中,我可以为不同的GL\U数组缓冲区使用多个GL\U元素\U数组\U缓冲区吗?我正在阅读“OpenGL ES 2.0编程指南”,第6章“顶点属性、数组和缓冲区对象”,有一个源示例:有几个GL_数组缓冲区(用于位置、法线、纹理坐标)和一个GL_元素数组缓冲区(“用于存储元素索引”) 当我写这个问题的时候,我发现我不能将一个以上的索引数组发送给gldrawerelements,所以如果我使用缓冲区,可能只有最后一个绑定的GL\u元素数组\u缓冲区用于绘图。
GLfloat gVertexPositions[] =
{
0.5f, 0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
-0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
0.5f, 0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
-0.5f, -0.5f, -0.5f,
-0.5f, 0.5f, -0.5f
};
GLfloat gVertexNormals[] =
{
1.0f, 0.0f, 0.0f, // top
-1.0f, 0.0f, 0.0f, // bottom
0.0f, 1.0f, 0.0f, // right
0.0f, -1.0f, 0.0f, // left
0.0f, 0.0f, 1.0f, // back
0.0f, 0.0f, -1.0f // front
};
2个索引数组(作为GL_元素_数组_缓冲区)
我设置顶点属性状态
glBindAttribLocation(program, ATTRIB_POSITION, "a_position");
glBindAttribLocation(program, ATTRIB_NORMAL, "a_normal");
//.....
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIds[VBO_POSITION_INDICES]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLubyte) * 36, gVertexPositionIndices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, vboIds[VBO_POSITION_DATA]);
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 3 * 8, gVertexPositions, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIds[VBO_NORMAL_INDICES]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLubyte) * 36, gVertexNormalIndices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, vboIds[VBO_NORMAL_DATA]);
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 3 * 6, gVertexNormals, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIds[VBO_POSITION_INDICES]);
glBindBuffer(GL_ARRAY_BUFFER, vboIds[VBO_POSITION_DATA]);
glEnableVertexAttribArray(ATTRIB_POSITION);
glBindBuffer(GL_ARRAY_BUFFER, vboIds[VBO_NORMAL_DATA]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIds[VBO_NORMAL_INDICES]);
glEnableVertexAttribArray(ATTRIB_NORMAL);
glVertexAttribPointer(ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, 0, 0);
glVertexAttribPointer(ATTRIB_NORMAL, 3, GL_FLOAT, GL_FALSE, 0, 0);
然后画
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, 0);
屏幕为空(因为最后一个GL_元素_数组_缓冲区用于“a_位置”属性,其中所有三元组都有相同的数字)
我想要的是-程序生成36个顶点,使用gVertExpositionIndex从gVertexPositions设置它们的位置,使用gVertExNormalIndex从gVertexNormals设置它们的法线。我怀疑这是可能的,但我想确切地知道。如果这是不可能的,那么正确的方法是什么?我是否必须为位置使用8*3浮点,为索引使用36字节,为法线使用36*3浮点?所以我只能保存位置属性的内存 我希望不会太晚,但我要做的是在顶点数组中按顶点设置法线,然后在声明顶点属性时使用适当的步长和缓冲区偏移。下面是我声明顶点和法线的代码:
GLfloat BlockVertexData[144] = {
//Right side...
//Vertices... //Normals...
1.0f, 2.0f, 0.5f, 1.0f, 0.0f, 0.0f, //B
1.0f, 2.0f, -0.5f, 1.0f, 0.0f, 0.0f, //F
1.0f, -2.0f, 0.5f, 1.0f, 0.0f, 0.0f, //D
1.0f, -2.0f, -0.5f, 1.0f, 0.0f, 0.0f, //H
//Front side...
-1.0f, 2.0f, 0.5f, 0.0f, 0.0f, 1.0f, //A
1.0f, 2.0f, 0.5f, 0.0f, 0.0f, 1.0f, //B
-1.0f, -2.0f, 0.5f, 0.0f, 0.0f, 1.0f, //C
1.0f, -2.0f, 0.5f, 0.0f, 0.0f, 1.0f, //D
//Left side...
-1.0f, 2.0f, 0.5f, -1.0f, 0.0f, 0.0f, //A
-1.0f, 2.0f, -0.5f, -1.0f, 0.0f, 0.0f, //E
-1.0f, -2.0f, 0.5f, -1.0f, 0.0f, 0.0f, //C
-1.0f, -2.0f, -0.5f, -1.0f, 0.0f, 0.0f, //G
//Back side...
-1.0f, 2.0f, -0.5f, 0.0f, 0.0f, -1.0f, //E
1.0f, 2.0f, -0.5f, 0.0f, 0.0f, -1.0f, //F
-1.0f, -2.0f, -0.5f, 0.0f, 0.0f, -1.0f, //G
1.0f, -2.0f, -0.5f, 0.0f, 0.0f, -1.0f, //H
//Top side...
-1.0f, 2.0f, -0.5f, 0.0f, 1.0f, 0.0f, //E
1.0f, 2.0f, -0.5f, 0.0f, 1.0f, 0.0f, //F
-1.0f, 2.0f, 0.5f, 0.0f, 1.0f, 0.0f, //A
1.0f, 2.0f, 0.5f, 0.0f, 1.0f, 0.0f, //B
//Bottom side...
-1.0f, -2.0f, -0.5f, 0.0f, -1.0f, 0.0f, //G
1.0f, -2.0f, -0.5f, 0.0f, -1.0f, 0.0f, //H
-1.0f, -2.0f, 0.5f, 0.0f, -1.0f, 0.0f, //C
1.0f, -2.0f, 0.5f, 0.0f, -1.0f, 0.0f //D };
GLuint BlockIndicesData[36] = {
//Right side...
2, 0, 3, 0, 1, 3,
//Front side...
6, 4, 7, 4, 5, 7,
//Left side...
11, 10, 8, 8, 9, 11,
//Back side...
15, 14, 12, 12, 13, 15,
//Top side...
19, 18, 16, 16, 17, 19,
//Bottom side...
23, 22, 20, 20, 21, 23 };
下面是声明属性的代码:
// The stride shows that there are 6 floats in each row.
GLsizei stride = 6 * sizeof(GLfloat);
GLuint attribute;
attribute = glGetAttribLocation(program, "VertexPosition");
glEnableVertexAttribArray(attribute);
glVertexAttribPointer(attribute, 3, GL_FLOAT, GL_FALSE, stride, 0);
attribute = glGetAttribLocation(self.program, "VertexNormal");
glEnableVertexAttribArray(attribute);
// The sixth parameter indicates the buffer offset, so here there were 3 floats preceding it, so this indicates it.
glVertexAttribPointer(attribute, 3, GL_FLOAT, GL_FALSE, stride, (GLvoid *)(sizeof(GLfloat) * 3));
我知道这可能会占用更多内存,但也许有人能想出更好的解决方案。这就是我能想到的解决您问题的方法。可能重复的
// The stride shows that there are 6 floats in each row.
GLsizei stride = 6 * sizeof(GLfloat);
GLuint attribute;
attribute = glGetAttribLocation(program, "VertexPosition");
glEnableVertexAttribArray(attribute);
glVertexAttribPointer(attribute, 3, GL_FLOAT, GL_FALSE, stride, 0);
attribute = glGetAttribLocation(self.program, "VertexNormal");
glEnableVertexAttribArray(attribute);
// The sixth parameter indicates the buffer offset, so here there were 3 floats preceding it, so this indicates it.
glVertexAttribPointer(attribute, 3, GL_FLOAT, GL_FALSE, stride, (GLvoid *)(sizeof(GLfloat) * 3));