几个独立的顶点缓冲对象

Several separate vertex buffer objects

为了渲染 3D 对象,创建了四个独立的顶点缓冲区:用于顶点、索引、纹理坐标和法线:

private final int[] VBO = new int[4]; // array for vertex buffer objects

private void createVertexBuffers() {
  VBO[0] = 0; VBO[1] = 0; VBO[2] = 0; VBO[3] = 0;

  GLES20.glGenBuffers(4, VBO, 0);
  bufferVertices.position(0);
  GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, VBO[0]);
  GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, VERTEX_STRIDE * NUMBER_VERTICES,
        bufferVertices, GLES20.GL_STATIC_DRAW); // VBO for vertex

  bufferTextureCoordinates.position(0);
  GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, VBO[1]);
  GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, TEXTURE_STRIDE * NUMBERS_TEXTURES,
        bufferTextureCoordinates, GLES20.GL_STATIC_DRAW); // VBO for texture coordinates

  bufferNormals.position(0);
  GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, VBO[2]);
  GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, VERTEX_STRIDE * NUMBER_NORMALS,
        bufferNormals, GLES20.GL_STATIC_DRAW); // VBO for normals

  bufferIndices.position(0);
  GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, VBO[3]);
  GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, INT_SIZE * NUMBER_INDICES,
        bufferIndices, GLES20.GL_STATIC_DRAW); // VBO for indices
}

3D对象本身也很多,缓冲区的数量也在增加。问题:使用许多单独的缓冲区是一种正常的方法吗?在移动应用程序中?我将不胜感激。

注:看了类似的题,还是心存疑虑。

交错属性(结构数组)通常比完全去交错属性(数组结构)更有效。这样做的原因是您不太可能加载整个缓存行然后只使用其中的一个值。

然而,最近的移动实现仍然喜欢 一些 级别的去交织。对于基于图块的 GPU,通常首先处理位置计算,然后仅在顶点对可见三角形有贡献时才处理其余的顶点着色器。为此,您需要两个打包缓冲区,一个用于所有有助于位置计算的属性,另一个用于所有其他内容。

一如既往,这伴随着警告。如果打包为结构数组会强制大量填充元素正确对齐,那会迅速消耗好处。