检索鼠标下的纹理坐标
Retrieve the texture coordinate under the mouse
我正在使用 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 );
在场景中单击时,我通过 glReadPixels
和 gluUnProject
检索鼠标光标下的顶点坐标。
我现在正在寻找的是一种检索与该职位关联的 texture coordinate
的方法。我没有找到关于这个主题的任何信息,所以我想知道是否有办法实现这一目标。
在搜索 OpenGL
规范后,我在版本 1.3
中找到了用于计算给定顶点的纹素的公式 [第 2 章,第 10 节,第4 - 生成纹理坐标].
从单位向量 u
开始,它在眼坐标 中从原点到顶点 并以 n
作为该顶点的法线 在眼坐标中,我们首先需要计算反射向量,r
:
r = u - 2n<sup>T</sup>(nu)
那么,我们要查找的S
、T
和R
坐标将分别是
rx, ry, rz
。
另外,there's a web 即"translates" 将公式伪代码化。我会 post 在这里 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;
}
我正在使用 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 );
在场景中单击时,我通过 glReadPixels
和 gluUnProject
检索鼠标光标下的顶点坐标。
我现在正在寻找的是一种检索与该职位关联的 texture coordinate
的方法。我没有找到关于这个主题的任何信息,所以我想知道是否有办法实现这一目标。
在搜索 OpenGL
规范后,我在版本 1.3
中找到了用于计算给定顶点的纹素的公式 [第 2 章,第 10 节,第4 - 生成纹理坐标].
从单位向量 u
开始,它在眼坐标 中从原点到顶点 并以 n
作为该顶点的法线 在眼坐标中,我们首先需要计算反射向量,r
:
r = u - 2n<sup>T</sup>(nu)
那么,我们要查找的S
、T
和R
坐标将分别是
rx, ry, rz。
另外,there's a web 即"translates" 将公式伪代码化。我会 post 在这里 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;
}