gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:55:29 27 4
gpt4 key购买 nike

为了渲染 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 对象本身也很多,缓冲区的数量也在增加。问题:使用许多单独的缓冲区是正常方法吗?在移动应用程序中?如果您能得到答案,我将不胜感激。

注意:看过类似的问题,但我仍然有不确定性。

最佳答案

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

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

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

关于java - 几个独立的顶点缓冲区对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60522180/

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