检索鼠标下的纹理坐标



我正在使用Qt 4.8及其OpenGL模块,使用固定管道,我有一个立方体映射的球体,每个立方体面的tex坐标由OpenGL通过glTexGenf (R, S和T坐标)自动生成。

glEnableClientState(GL_NORMAL_ARRAY);
const GLenum textgt = GL_TEXTURE_CUBE_MAP;
const GLfloat param = GL_REFLECTION_MAP;
glTexGenf( GL_S, GL_TEXTURE_GEN_MODE, param );
GLenum error = glGetError();
if(GL_NO_ERROR != error) { ... }
glTexGenf( GL_T, GL_TEXTURE_GEN_MODE, param );
error = glGetError();
if(GL_NO_ERROR != error) { ... }
glTexGenf( GL_R, GL_TEXTURE_GEN_MODE, param );
error = glGetError();
if(GL_NO_ERROR != error) { ... }
glEnable( GL_TEXTURE_GEN_S );
glEnable( GL_TEXTURE_GEN_T );
glEnable( GL_TEXTURE_GEN_R );

当点击场景时,我通过glReadPixelsgluUnProject检索鼠标光标下的顶点坐标。

我现在正在寻找的是一种检索与该位置相关的texture coordinate的方法。我没有找到任何关于这个主题的东西,所以我想知道是否有一种方法可以实现这一点。

在搜索了OpenGL规范之后,我在1.3版本中找到了用于计算给定顶点的纹理的公式[第2章,第10节,第4部分-生成纹理坐标]

从从原点到眼坐标顶点的单位向量u开始,并将n作为眼坐标顶点的法线,我们首先需要计算反射向量r:

r = u - 2nT(nu)

那么,我们正在寻找的S, TR坐标将分别为

rx, ry, rz

还有一个网站可以将公式"翻译"为伪代码。我将在这里发布GL_REFLECTION_MAP的相关部分,以防页面不可用:

 for(i=0; i<total; i++)
 {
   myEyeVertex = MatrixTimesVector(ModelviewMatrix, myVertex[i]);
   myEyeVertex = Normalize(myEyeVertex);
   myEyeNormal = VectorTimesMatrix(myNormal[i], InverseModelviewMatrix);
   dotResult = 2.0 * dot3D(myEyeVertex, myEyeNormal);
   //I am emphasizing that we write to s and t and r. Used to sample a cubemap.
   myTexCoord[i].s = myEyeVertex.x - myEyeNormal.x * dotResult;
   myTexCoord[i].t = myEyeVertex.y - myEyeNormal.y * dotResult;
   myTexCoord[i].r = myEyeVertex.z - myEyeNormal.z * dotResult;
 }

相关内容

  • 没有找到相关文章

最新更新