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,通常先处理位置计算,然后仅处理顶点着色器的其余部分(如果顶点对可见三角形有贡献)。为此,需要两个压缩缓冲区,一个用于所有有助于位置计算的属性,另一个用于所有其他属性
像往常一样,这需要注意。如果作为结构数组进行打包会迫使大量填充元素正确对齐,那么这将很快侵蚀其好处