gpt4 book ai didi

ios - 在 iOS 上使用具有多个 VBO 和 IBO(多个对象)OpenGLES 2 的 VAO 进行绘制

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:12:57 24 4
gpt4 key购买 nike

我对多个对象(大约 200 个对象,其中 15 个对象一次可见,每个对象都有自己的顶点和索引缓冲区)使用 VAO(顶点数组对象)感到有些困惑。下面是我的渲染函数

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{

glClearColor(0.50f, 0.50f, 0.50f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

[super drawLines];


for(int i=0; i< self.numberofBars; i++) //numberofBars

{

// Render the object

[self.barShaderProg use];

iVBarNode *temp = [theBars objectAtIndex:i];

_modelViewProjectionMatrix = GLKMatrix4Multiply(ProjectionView, modelMatrix);
_modelViewProjectionMatrix = GLKMatrix4Multiply(_modelViewProjectionMatrix, temp.modelMatrix);
GLKMatrix4 modeltotalMatrix = GLKMatrix4Multiply(modelMatrix, temp.modelMatrix);
GLKMatrix4 modelViewMatrix = GLKMatrix4Multiply(ViewMatrix, modeltotalMatrix);

_normalMatrix = GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix), NULL);


glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);
glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0,_normalMatrix.m);//
glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEW_MATRIX], 1, 0, modelViewMatrix.m);

glUniform4f(uniforms[COLOR_VECTOR], temp.barColor.r, temp.barColor.g, temp.barColor.b, temp.barColor.a);

//bind corresponding buffer before drawing
glBindBuffer(GL_ARRAY_BUFFER, [temp getVertexID]);


glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 6*sizeof(GLfloat), BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 6*sizeof(GLfloat), BUFFER_OFFSET(12));


glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, [temp getIndexID]);
glDrawElements(GL_TRIANGLES, [temp.bar getIndicesSize], GL_UNSIGNED_SHORT, (void*)0);
}


if(self.translation>0)
{
self.paused = NO;

}
else{
self.paused = YES;
}
}

这工作得很好。在 OpenGLES 分析器中分析我的代码后,它显示使用 VAO 从中受益,因为 glVertexAttribPointer 调用是冗余的(对所有人都一样)。但我只是不知道是否可以将它们与不同的顶点缓冲区对象一起使用。我在互联网上找到的大多数示例仅将它们与一个 VBO 或两个 VBO 一起使用,其中第二个 VBO 定义了不同的属性,而不是我的情况下的相同属性。我尝试绑定(bind)为我的对象生成的每个顶点缓冲区索引使用单个 VAO 但它没有像下面那样工作

-(void) configureVertexArrayObject

{

// Create and bind the vertex array object.

glGenVertexArraysOES(1,&vertexArrayObject);

glBindVertexArrayOES(vertexArrayObject);

for(int i=0;i<self.numberofBars;i++)
{
iVBarNode *myNode = [theBars objectAtIndex:i];

glBindBuffer(GL_ARRAY_BUFFER, [myNode getVertexID]);
// Configure the attributes in the VAO
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 6*sizeof(GLfloat), BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 6*sizeof(GLfloat), BUFFER_OFFSET(12));

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, [myNode getIndexID]);

}

// Bind back to the default state.

glBindBuffer(GL_ARRAY_BUFFER,0);

glBindVertexArrayOES(0);

我是这样渲染的

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{

glClearColor(0.50f, 0.50f, 0.50f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

[super drawLines];

glBindVertexArrayOES(vertexArrayObject);

for(int i=0; i< self.numberofBars; i++) //numberofBars

{

// Render the object

[self.barShaderProg use];

iVBarNode *temp = [theBars objectAtIndex:i];

_modelViewProjectionMatrix = GLKMatrix4Multiply(ProjectionView, modelMatrix);
_modelViewProjectionMatrix = GLKMatrix4Multiply(_modelViewProjectionMatrix, temp.modelMatrix);
GLKMatrix4 modeltotalMatrix = GLKMatrix4Multiply(modelMatrix, temp.modelMatrix);
GLKMatrix4 modelViewMatrix = GLKMatrix4Multiply(ViewMatrix, modeltotalMatrix);

_normalMatrix = GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix), NULL);


glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);
glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0,_normalMatrix.m);//
glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEW_MATRIX], 1, 0, modelViewMatrix.m);

glUniform4f(uniforms[COLOR_VECTOR], temp.barColor.r, temp.barColor.g, temp.barColor.b, temp.barColor.a);

//all buffer associated with VAO now

glDrawElements(GL_TRIANGLES, [temp.bar getIndicesSize], GL_UNSIGNED_SHORT, (void*)0);
}

glBindVertexArrayOES(0);

if(self.translation>0)
{
self.paused = NO;


}
else{
self.paused = YES;

}


}

在我的第二次尝试中,我尝试只指定 VAO 的布局,对顶点和法线使用 glVertexAttribPointer()(而不指定 VBO 和 IBO id),并像我在没有 VAO 的情况下所做的那样渲染(上面的第一个渲染代码), 但现在我没有指定顶点布局使用glVertexAttribPointer() 正如我已经向 VAO 提到的那样(实际上这是使用 VAO 的全部意义)。 这两种方法都给了我相同大小的对象,这让我觉得 VAO 以某种方式为我的所有对象复制了几何体。我的所有对象都具有相同的几何形状但高度不同。现在我有一个选择是拥有一个顶点和索引缓冲区对象,我可以沿着高度缩放并根据我的需要定位对象。我仍然想知道 VAO 实际持有什么,不持有什么,以及是否有办法让它发挥作用。

最佳答案

After analysing my code in the OpenGLES Analyser it showed to use VAO to benefit from them as the glVertexAttribPointer calls were reduntant (same for all).

除非您的 glBindBuffer 调用每次都绑定(bind)相同的缓冲区,否则我觉得这个推理很可疑。

通过将所有对象打包到相同 缓冲区中,您可以从中获得更多 yield ,从而在绘制时执行一次 bind+glVertexAttribPointer 调用。由于所有对象都具有相同的顶点格式,因此似乎没有理由不能这样做。您必须调整顶点索引以在现在更大的缓冲区中选择正确的位置,但这并不难。

关于ios - 在 iOS 上使用具有多个 VBO 和 IBO(多个对象)OpenGLES 2 的 VAO 进行绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13388723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com