Java 几个独立的顶点缓冲区对象

Java 几个独立的顶点缓冲区对象,java,android,opengl-es,Java,Android,Opengl Es,对于渲染三维对象,将创建四个单独的顶点缓冲区:对于顶点、索引、纹理坐标和法线: 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); bufferVertic

对于渲染三维对象,将创建四个单独的顶点缓冲区:对于顶点、索引、纹理坐标和法线:

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,通常先处理位置计算,然后仅处理顶点着色器的其余部分(如果顶点对可见三角形有贡献)。为此,需要两个压缩缓冲区,一个用于所有有助于位置计算的属性,另一个用于所有其他属性

像往常一样,这需要注意。如果作为结构数组进行打包会迫使大量填充元素正确对齐,那么这将很快侵蚀其好处