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

标签 java android opengl-es

为了渲染 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/

相关文章:

java - 我应该执行 SQLQuerys 还是将所有数据转储到列表/vector java 上

java - 在线 Java 的 JSON 解析器

Android 计费 v3 - BillingClientImpl.java 中的 NullPointerException :668

java - 有没有人有在渲染器类之外绘制对象的示例?

ios - 当图像太大时使用 OpenGL 的黑色纹理

java - 动态获取当前方法名称的较短方法

java - 将数字的数字转换为单词

java - MYSQL/JAVA - 如何对这样的数字进行排序?

android - 同步 Android 联系人与服务器 - 同步算法

android - 恒定 FPS Android OpenGLES