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

时间:2011-02-13 22:26:25

标签: 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_TRIANGLES, mNumOfIndices,
                GL10.GL_UNSIGNED_SHORT, mIndicesBuffer);
           float[] result = getVertices(mVerticesBuffer);

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

2 个答案:

答案 0 :(得分:2)

OpenGL不是数学库。它不会对您传递给它的数据进行任何修改。您可以请求缓冲区等内容,但仅限于明确请求,而不是您错误预期的方式。

由模型视图和投影矩阵定义的变换,使用glLoadMatrix,glMultMatrix,glTranslate,glRotate,glScale进行操作,这些变换原位应用于顶点位置,仅用于处理每个顶点并且不会持久存储。有转换反馈来检索转换后的顶点数据,但这会通过不同的OpenGL对象和缓冲区。

答案 1 :(得分:2)

你需要的是变换反馈(TF)的确切情况:你想要获得变换后的顶点。 这对今天的OpenGL来说非常好。以下是使用它的说明:

  1. 创建一个执行必要顶点变换的着色器(仅包含顶点组件)。在链接告诉GL关于您想要记录的着色器中的不同输出之前,请调用glTransformFeedbackVaryings。
  2. 准备一个VBO来存储结果。在做TF之前,调用glBindBufferBase告诉GL关于结果值的存储。
  3. 执行TF时,调用glBeginTransformFeedback()并记录GL_PRIMITIVES_WRITTEN类型的查询。