Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android OpenGL着色器:如何分别移动每个顶点?_Android_Opengl Es_Shader_Rajawali - Fatal编程技术网

Android OpenGL着色器:如何分别移动每个顶点?

Android OpenGL着色器:如何分别移动每个顶点?,android,opengl-es,shader,rajawali,Android,Opengl Es,Shader,Rajawali,我正在尝试Rajawali library for Android在场景中绘制一些基本的3d对象。 这里有一个2000个平面示例,演示了如何使用一个着色器非常“便宜”地渲染大量顶点。我可以将顶点数组传递给着色器并绘制它们 我想升级这个示例并移动一些彼此独立的顶点 我尝试过使用glBufferSubData,但无法在场景中更改任何内容。我发现的一种方法是更改数据并重新创建缓冲区,但我希望有一种更简单的方法只更改必要的数据 例如,我只想从已经创建和绑定的缓冲区更改一些位置 初始化位置 flo

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

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

我尝试过使用glBufferSubData,但无法在场景中更改任何内容。我发现的一种方法是更改数据并重新创建缓冲区,但我希望有一种更简单的方法只更改必要的数据

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

初始化位置

    float[] planePositions = new float[numVertices * 3];
    ....
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, planePosBufferHandle);
    GLES20.glEnableVertexAttribArray(maPlanePositionHandle);
    fix.android.opengl.GLES20.glVertexAttribPointer(maPlanePositionHandle, 3, GLES20.GL_FLOAT,
            false, 0, 0);   
创建缓冲区

    mGeometry.createBuffer(mPlanePositionsBufferInfo, BufferType.FLOAT_BUFFER, mPlanePositions,     GLES20.GL_ARRAY_BUFFER);
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
设定位置

    float[] planePositions = new float[numVertices * 3];
    ....
    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()。我将以下代码放在一个update方法中,该方法在我的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);

修改缓冲区之前是否需要锁定它?我也是非常新的,并且使用OGR3D和C++,但是原理应该是相同的。您应该能够获取当前顶点缓冲区,锁定它,修改它,然后解锁它。我不认为你还需要做什么,但我可能完全错了。对不起,我帮不上什么忙。glBufferSubData应该可以正常工作,您能展示一下您尝试过但不起作用的内容吗?