2011-02-13 35 views
0

假设我画一个立方体这样的:如何获取已在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

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

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

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

通过使用glLoadMatrix,glMultMatrix,glTranslate,glRotate,glScale处理的模型视图和投影矩阵定义的变换仅在处理每个顶点时被原地应用到顶点位置,并且不会被存储持续。有转换反馈来检索转换的顶点数据,但是这通过一个不同的OpenGL对象和缓冲区。

+0

谢谢。你能告诉我这个OpenGL的其他对象和缓冲区有关变换反馈吗?我怎样才能访问它? – ace 2011-02-14 08:41:52

+1

只有在想要获得着色器操作的结果时,变换反馈才有意义。如果您只想通过静态转换矩阵转换顶点,只需自己实施数学运算。这很容易胜过OpenGL,因为大多数OpenGL实现只是为了快速获取屏幕上的内容而优化的。 – datenwolf 2011-02-14 09:45:17