OpenGL ES的 - 如何批量渲染500+颗粒瓦特/不同的阿尔法,旋转和尺度?(OpenGL E

2019-07-30 18:10发布

我正在开发一款iOS游戏,将需要一次呈现500-800颗粒。 据我了解,这是一个好主意,批次渲染OpenGL ES的许多精灵而不是调用glDrawArrays(..)在游戏中每一个角色,为了能够使更多的精灵瓦特/帧速率急剧减少。

我的问题是 :我怎么渲染500+颗粒都有着不同的阿尔法,旋转和尺度,但共享相同的纹理图集? 这个问题的重点是在不同的 阿尔法旋转 ,和比例为每个粒子。

我意识到这个问题是非常相似, 我怎么画1000+颗粒(W /独特的旋转,缩放和alpha)的iPhone OpenGL ES的粒子系统,不会拖慢游戏? 然而,问题并没有解决批渲染。 之前我把顶点缓冲对象的优势,我想了解在OpenGL ES批渲染瓦特/独特的阿尔法,旋转和尺度(但具有相同的纹理)。 因此,当我打算使用维也纳各组织的最后,我想先采取这种做法。

代码示例将大大可以理解的,如果你使用一个索引数组作为一些例子做,请说明指数阵列的结构和用途。

编辑我使用的OpenGL ES 1.1。

编辑下面是我如何渲染场景中的每个粒子的代码示例。 假设它们共享相同的纹理和纹理中的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();
}

A码替代这种方法,将不胜感激!

Answer 1:

一种可能性是包括在顶点数组ATTRIB这样的价值观 - 我认为这是最好的选择。 如果您使用的OpenGL ES 1.1,而不是2.0你拧出此方法。 顶点ATTRIB阵列允许您在这种情况下,你可以存储阿尔法和旋转各自在自己的ATTRIB阵列,并将它们传递到与着色器每个顶点存储值glVertexAttribArray 。 然后着色器会做旋转变换和颜色处理与阿尔法。

另一种选择是做在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, ...);

对于这个解决方案的很好的优化将是共享缓存为每个渲染,所以你不必重新分配他们每帧。



文章来源: OpenGL ES - How to Batch Render 500+ particles w/ different alphas, rotations, and scales?