gpt4 book ai didi

android - OpenGL 着色器 : How do I move each vertex separately?

转载 作者:太空狗 更新时间:2023-10-29 12:51:49 24 4
gpt4 key购买 nike

我正在尝试使用适用于 Android 的 Rajawali 库在场景中绘制一些基本的 3d 对象。有一个示例 2000 个平面,它展示了如何使用一个着色器非常“廉价”地渲染大量顶点。我可以将顶点数组传递给着色器并绘制它们。

我想升级这个示例并独立移动一些顶点。

我试过 glBufferSubData,但我无法改变现场的任何东西。我发现的一种方法是更改​​数据并重新创建缓冲区,但我希望有一种更简单的方法来仅更改必要的数据。

例如,我只想从已经创建和绑定(bind)的缓冲区中更改一些位置。

初始化位置

    float[] planePositions = new float[numVertices * 3];
....

创建缓冲区

    mGeometry.createBuffer(mPlanePositionsBufferInfo, BufferType.FLOAT_BUFFER, mPlanePositions,     GLES20.GL_ARRAY_BUFFER);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);

设置位置

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, planePosBufferHandle);
GLES20.glEnableVertexAttribArray(maPlanePositionHandle);
fix.android.opengl.GLES20.glVertexAttribPointer(maPlanePositionHandle, 3, GLES20.GL_FLOAT,
false, 0, 0);

我如何修改第一个平面的第一个顶点的位置? (planePositions[0] = a;planePositions[1] = b; planePositions[1] = c...现在我必须将这个修改后的数组传递给 opengl 但不知道如何传递)。

最佳答案

您需要做的就是修改缓冲区数据,然后从 PlanesGalore 类调用 mGeometry.changeBufferData()。我将以下代码放在更新方法中,该方法在我的 Renderer 类的 onDrawFrame() 事件期间调用。

for (int i = 0; i < vertices.length; i += 3) {
mPlanePositions= mPlanePositions.put(i, mPlanePositions.get(i) - 0.01f);
}

mGeometry.changeBufferData(mCubePositionsBufferInfo, mPlanePositions, 0);

这是我能找到的完成 Action 的最佳方式。此外,我已提议对此 issue 进行更改这会让您指定缓冲区的哪一部分发生了变化,这应该会提供更高的性能。

编辑

我对引擎的更改已获批准,因此您现在可以像这样进一步优化它。

// The offset position should be vertices.length * object #. In my use case this is 72*x
// allowing me to update the XYZ coordinates of all 24 vertices of a cube.
int offsetPosition = 0;
mGeometry.changeBufferData(mCubePositionsBufferInfo, mPlanePositions, offsetPosition, offsetPosition + vertices.length);

关于android - OpenGL 着色器 : How do I move each vertex separately?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11521133/

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