Opengl es 如何获取已在OpenGL ES中绘制的网格的顶点?

Opengl es 如何获取已在OpenGL ES中绘制的网格的顶点?,opengl-es,Opengl Es,假设我画了一个这样的立方体: gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVerticesBuffer); gl.glTranslatef(x, y, z); gl.glRotatef(rz, 0, 0, 1); gl.glRotatef(rx, 1, 0, 0); gl.glRotatef(ry, 0, 1, 0); gl.glDrawElements(GL10.GL_TR

假设我画了一个这样的立方体:

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVerticesBuffer);

        gl.glTranslatef(x, y, z);
        gl.glRotatef(rz, 0, 0, 1);
        gl.glRotatef(rx, 1, 0, 0);
        gl.glRotatef(ry, 0, 1, 0);

        gl.glDrawElements(GL10.GL_TRIANGLES, mNumOfIndices,
                GL10.GL_UNSIGNED_SHORT, mIndicesBuffer);
           float[] result = getVertices(mVerticesBuffer);

其中mVerticesBuffer是具有立方体顶点的FloatBuffer。在移动和旋转立方体之后,我希望mVerticesBuffer中的值已经改变,我应该能够将这些值作为普通浮点数组返回。当我尝试从mVerticesBuffer获取这些值时,我总是在任何平移/旋转之前获取对应于多维数据集位置的值。是否有OpenGL API来获取正确的值,或者我遗漏了什么?

OpenGL不是一个数学库。它不会对您传递给它的数据进行任何修改。您可以请求缓冲区等的内容,但只能在显式请求时请求,而不是错误地期望它这样做


由modelview和投影矩阵定义的变换,使用glLoadMatrix、glMultMatrix、glTranslate、glRotate、glScale进行操作,这些变换仅在处理每个顶点时就地应用于顶点位置,并且不会永久存储。有变换反馈来检索变换后的顶点数据,但这需要通过不同的OpenGL对象和缓冲区。

您需要的是变换反馈(TF)的确切情况:您希望恢复变换后的顶点。这对于今天的OpenGL来说是非常好的。以下是使用说明:

  • 创建一个着色器(仅包含顶点组件),以执行必要的顶点变换。链接前调用GLTransformFeedbackVaryngs,告诉GL您要录制的着色器中的各种输出
  • 准备VBO以存储结果。在执行TF之前,请调用glBindBufferBase,告知GL结果值的存储
  • 执行TF时,调用glBeginTransformFeedback()并记录类型为GL_PRIMITIVES_writed的查询

  • 谢谢你能告诉我关于变换反馈的另一个OpenGL对象和缓冲区是什么吗?我怎样才能访问它?只有当你想得到着色器操作的结果时,变换反馈才有意义。如果您只想通过静态变换矩阵变换顶点,只需自己实现数学。这将很容易胜过OpenGL,因为大多数OpenGL实现都只是为了快速在屏幕上显示而优化的。