0

我正在使用Qt 4.8它的OpenGL模块,使用固定的管道,并且我有一个立方体映射的球体,每个立方体面的 tex 坐标由OpenGLvia 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 );

在场景中单击时,我通过glReadPixels和检索鼠标光标下的顶点坐标gluUnProject

我现在正在寻找的是一种检索 texture coordinate与该位置相关联的方法。我没有找到有关此主题的任何内容,所以我想知道是否有办法实现这一目标。

4

1 回答 1

0

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

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

r = u - 2nT(nu)

然后,S我们正在寻找的T和坐标将是R

r x , r y , r z
分别。

此外,还有一个将公式“翻译”为伪代码的网络。如果页面不可用,我将在此处发布相关部分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;
 }
于 2015-05-21T10:26:55.333 回答