(我决定尝试用一种不同的方式来问这个问题,以可能推动如何做到这一点)
仅使用清单9-4作为OpenGL ES的苹果iOS指南"OpenGL ES Programming guide for iOS“的”使用顶点数据的最佳实践“的基础。
我想基本上将位置日期“添加”到这个缓冲区中。(能以某种方式完成吗?)
然后在使用glDrawElements时调用哪个标识符...
有没有办法做到这一点?显示的是我想要做的例子,给一个视觉。
typedef struct VertexData3D
{
GLfloat position[3];
GLfloat normal[3];
} VertexData3D;
GLuint test1Buffer;
GLuint test2Buffer;
GLuint index1Buffer;
GLuint index2Buffer;
const VertexData3D test1Buffer[] = {...};
const VertexData3D test2Buffer[] = {...};
const GLushort indices1[] = {...};
const GLushort indices2[] = {...};
void CreateBuffers()
{
// Static position data
glGenBuffers(1, &test1Buffer);
glBindBuffer(GL_ARRAY_BUFFER, test1Buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(test1VertexData), test1VertexData, GL_STATIC_DRAW);
glGenBuffers(1, &test2Buffer);
glBindBuffer(GL_ARRAY_BUFFER, test2Buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(test2VertexData), test2VertexData, GL_STATIC_DRAW);
// Static index data
glGenBuffers(1, &index1Buffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index1Buffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices1), indices1, GL_STATIC_DRAW);
glGenBuffers(1, &index2Buffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index2Buffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices2), indices2, GL_STATIC_DRAW);
glVertexPointer(3, GL_FLOAT, sizeof(VertexData3D), (void*)0);
glNormalPointer(GL_FLOAT, sizeof(VertexData3D), (void*)12);
}
// sometimes in the model, draw out this test1model.
void DrawModelusingTest1()
{
glBindBuffer(GL_ARRAY_BUFFER, test1VertexData);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index1Buffer);
glDrawElements(GL_TRIANGLES, theNumberInIndex1, GL_UNSIGNED_SHORT, (void*)0);
}
// sometimes in the model, draw out this test2model.
void DrawModelusingTest2()
{
glBindBuffer(GL_ARRAY_BUFFER, test2VertexData);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index2Buffer);
glDrawElements(GL_TRIANGLES, theNumberInIndex2, GL_UNSIGNED_SHORT, (void*)0);
}发布于 2011-05-19 12:11:27
听起来你想要glDrawElementsInstanced
发布于 2011-05-19 16:09:27
Rotoglup对我的问题的回答here可能会有所帮助,特别是关于实例化技术的this link。
我只是在技术列表中添加了使用glVertexAttribDivisor 传递每个实例(而不是每个顶点)属性,而不是使用统一缓冲区。
基本上,您使用一个VBO来保存几何体,使用另一个VBO来保存每个实例的所有模型视图矩阵。然后使用glVertexAttribDivisor指示模型视图VBO应该在每个实例中前进一次,并调用glDrawElementsInstanced一次来绘制所有对象。
发布于 2011-05-19 17:38:57
首先,你的3D网格看起来真的很静态,没有必要每一帧都调用glGenBuffers。在初始化时,对每个网格执行一次。
你的for (int i = 0; i < numOfShapes; i++)对我来说毫无意义。你绑定了大量的glBindBuffers,并在循环之后调用glDrawElements,这意味着除非我遗漏了什么,否则只有最后一个buffers才会真正做一些事情。
如果你的所有场景都是静态的(只有摄像机在移动),你可以构建一个巨大的VBO (就像你在glGenBuffers中做的那样),把你所有的数据放在里面,然后用不同的矩阵调用它4次。
如果有任何东西是动态的,并且你所有的形状都是相似的,看看Ben Voigt建议的实例化;但简单地避免重新构建每一帧的一切应该已经提高了你的fps。
附注:我没有时间完全阅读你的代码,但如果你每次只有一个重复的对象,我真的希望你只有一个vbo,对同一个VBO有多个glDrawArrays调用……
https://stackoverflow.com/questions/6053506
复制相似问题