gpt4 book ai didi

ios - 将附近的对象渲染在其他对象之上时,OpenGL 会变慢

转载 作者:太空宇宙 更新时间:2023-11-04 07:30:22 26 4
gpt4 key购买 nike

我正在编写一个 iOS 应用程序,使用 OpenGL ES 2.0 将多个对象渲染到屏幕上。目前,这些对象是简单的形状(正方形、球体和圆柱体)。

当所有对象都没有彼此重叠时,程序会以 30 fps 的速度平稳运行。

当我添加出现在其余模型后面的对象(例如背景矩形)时,我的问题就出现了。当我尝试绘制背景矩形时,我只能在它前面绘制占不到屏幕一半的对象。任何大于此值的帧速率都会下降到 15 到 20 fps 之间。

就目前而言,我所有的模型,包括背景,都是用以下代码绘制的:

- (void)drawSingleModel:(Model *)model
{
//Create a model transform matrix.
CC3GLMatrix *modelView = [CC3GLMatrix matrix];

//Transform model view
// ...
//Pass matrix to shader.
glUniformMatrix4fv(_modelViewUniform, 1, 0, modelView.glMatrix);

//Bind the correct buffers to openGL.
glBindBuffer(GL_ARRAY_BUFFER, [model vertexBuffer]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, [model indexBuffer]);
glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);

glVertexAttribPointer(_colorSlot, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 3));

//Load vertex texture coordinate attributes into the texture buffer.
glVertexAttribPointer(_texCoordSlot, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 7));
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, [model textureIndex]);
glUniform1i(_textureUniform, 0);

glDrawElements([model drawMode], [model numIndices], GL_UNSIGNED_SHORT, 0);
}

这段代码是从我的draw方法中调用的,定义如下:

- (void)draw
{
glUseProgram(_programHandle);
//Perform OpenGL rendering here.
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);

_camera = [CC3GLMatrix matrix];

//Camera orientation code.
//...

//Pass the camera matrix to the shader program.
glUniformMatrix4fv(_projectionUniform, 1, 0, _camera.glMatrix);

glViewport(0, 0, self.frame.size.width, self.frame.size.height);
//Render the background.
[self drawSingleModel:_background];

//Render the objects.
for(int x = 0; x < [_models count]; ++x)
{
[self drawSingleModel:[_models objectAtIndex:x]];
}

//Send the contents of the render buffer to the UI View.
[_context presentRenderbuffer:GL_RENDERBUFFER];
}

我发现通过改变渲染顺序如下:

    for(int x = 0; x < [_models count]; ++x)
{
[self drawSingleModel:[_models objectAtIndex:x]];
}
[self drawSingleModel:_background];

我在背景上渲染时的帧速率是 30 fps。

当然,如果 _models 中的任何对象必须在彼此前面渲染,速度仍然会降低。此外,按此顺序渲染会导致半透明和透明对象被绘制成黑色。

我对 OpenGL 还是有些陌生,所以我不太清楚我的问题出在哪里。我的假设是执行深度测试速度变慢,而且我也意识到我正在使用移动设备。但我不敢相信 iOS 设备太慢了,无法做到这一点。该程序仅渲染 5 个模型,每个模型约有 180 个三角形。

有什么我没有看到的东西,或者有什么解决方法吗?任何建议或指示将不胜感激。

最佳答案

您正在运行移动 GPU 的特性之一:这些东西(NVidia Tegra 除外)不对隐藏表面移除进行深度测试。大多数移动 GPU,包括 iPad 中的 GPU 都是基于图 block 的光栅化器。这样做的原因是为了节省内存带宽,因为内存访问实际上是一个耗电的操作。在移动设备的功率受限环境中,减少所需的内存带宽可显着延长电池生命周期。

基于图 block 的渲染器将视口(viewport)分成许多图 block 。将几何图形发送到其中时,它会被拆分为多个图 block ,然后对于每个图 block ,它与图 block 中已有的几何图形相交。大多数时候,瓦片只被一个图元覆盖。如果传入的图元恰好在已经存在的几何体前面,它将替换它。如果存在切割交叉点,则会添加一条新边。只有当达到一定的边数阈值时,该单个瓦片才会切换到深度测试模式。

只有在同步点,准备好的图 block 才会被栅格化。

现在很明显为什么重叠对象会降低渲染性能:图元重叠越多,设置图 block 所需的预处理就越多。

关于ios - 将附近的对象渲染在其他对象之上时,OpenGL 会变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14391284/

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