gpt4 book ai didi

objective-c - OpenGL ES - 如何批量渲染 500 多个具有/不同 alpha、旋转和缩放的粒子?

转载 作者:可可西里 更新时间:2023-11-01 17:10:05 26 4
gpt4 key购买 nike

我正在开发一款 iOS 游戏,需要一次渲染 500-800 个粒子。我了解到,最好在 OpenGL ES 中批量渲染许多 Sprite ,而不是在游戏中的每个 Sprite 上调用 glDrawArrays(..),以便能够渲染更多 Sprite w/out帧率急剧下降。

我的问题是:我如何批量渲染 500 多个粒子,它们都具有不同的 alpha、旋转和缩放,但共享相同的纹理图集?这个问题的重点在于每个粒子的不同alphas旋转尺度

我意识到这个问题与 How do I draw 1000+ particles (w/ unique rotation, scale, and alpha) in iPhone OpenGL ES particle system without slowing down the game? 非常相似,但是,该问题不涉及批量渲染。在我利用顶点缓冲对象之前,我想了解 OpenGL ES 中的批量渲染,它具有独特的 alphas、旋转和缩放(但具有相同的纹理)。因此,虽然我最终计划使用 VBO,但我想首先采用这种方法。

代码示例将不胜感激,如果您像某些示例一样使用索引数组,请解释索引数组的结构和用途。

编辑我正在使用 OpenGL ES 1.1。

编辑 下面是我如何渲染场景中每个粒子的代码示例。假设它们共享相同的纹理,并且在执行此代码之前该纹理已绑定(bind)在 OpenGL ES 1.1 中。

- (void) render {

glPushMatrix();

glTranslatef(translation.x, translation.y, translation.z);

glRotatef(rotation.x, 1, 0, 0);
glRotatef(rotation.y, 0, 1, 0);
glRotatef(rotation.z, 0, 0, 1);

glScalef(scale.x, scale.y, scale.z);

// change alpha
glColor4f(1.0, 1.0, 1.0, alpha);

// glBindTexture(GL_TEXTURE_2D, texture[0]);

glVertexPointer(2, GL_FLOAT, 0, texturedQuad.vertices);
glEnableClientState(GL_VERTEX_ARRAY);


glTexCoordPointer(2, GL_FLOAT, 0, texturedQuad.textureCoords);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glPopMatrix();
}

将不胜感激此方法的替代代码!

最佳答案

一种可能性是将这些值包含在一个顶点属性数组中——我认为这是最好的选择。如果您使用的是 OpenGL ES 1.1 而不是 2.0,那么您就无法使用这种方法了。顶点属性数组允许您在每个顶点存储值,在这种情况下,您可以将 alpha 和旋转分别存储在它们自己的属性数组中,并使用 glVertexAttribArray 将它们传递给着色器。然后着色器将使用 alpha 进行旋转变换和颜色处理。

另一种选择是在 CPU 上进行旋转变换,然后将具有相似 alpha 值的粒子批处理到多个绘制调用中。这个版本需要更多的工作,它不会是一个单一的绘制调用,但如果着色器不是一个选项,它仍然有助于优化。

注意:您链接到的问题也推荐数组解决方案

编辑:鉴于您的代码是 OpenGL ES 1.0,这里是使用 glColorPointer 的解决方案:

// allocate buffers to store an array of all particle data
verticesBuffer = ...
texCoordBuffer = ...
colorBuffer = ...

for (particle in allParticles)
{
// Create matrix from rotation
rotMatrix = matrix(particle.rotation.x, particle.rotation.y, particle.rotation.z)
// Transform particle by matrix
verticesBuffer[i] = particle.vertices * rotMatrix

// copy other data
texCoordBuffer[i] = particle.texCoords;
colorBuffer[i] = color(1.0, 1.0, 1.0, particle.alpha);
}

glVertexPointer(verticesBuffer, ...)
glTexCoordPointer(texCoodBuffer, ...)
glColorPointer(colorBuffer, ...)

glDrawArrays(particleCount * 4, ...);

此解决方案的一个很好的优化是为每个渲染共享缓冲区,这样您就不必在每一帧都重新分配它们。

关于objective-c - OpenGL ES - 如何批量渲染 500 多个具有/不同 alpha、旋转和缩放的粒子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11787709/

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