通过将近裁剪平面设置为1而不是0(不确定为什么一开始会这样),已经解决了问题。请参见骨架代码的问题,以及Adrian的答案,了解其如何运作和原理。
我有几个不同的相机位置,我的场景只包含一个四边形。
这个四边形恰好在第一帧中投影到视口/窗口上。我想从这个相机位置投影纹理到四边形上。该纹理也完全覆盖了视口。
我做的第一件事是
// GL_QUADS...
glTexCoord2f( /*one corner of s,t space*/);
glVertex3f(/* appropriate vertex */);;
我最终得到了这样的结果(图片非本人所拍)。
然后我意识到,当然,它需要是一个投射变换。根据这些笔记的说法:
- 模型视图转换以使投影适合场景。
- 投射变换(透视或正交)。
- 比例因子和偏置映射近剪裁平面到纹理坐标。
// in init code
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
double ratio = width/height;
// set up FROM modelview matrix
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluPerspective(pcam._fov/ratio, ratio, 1, far_z);
gluLookAt(/* FROM camera's parameters */);
glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); //S, T, R and Q
GLfloat Splane[] = {1.f, 0.f, 0.f, 0.f}; //S, T, R and Q, diagonal
glTexGenfv(GL_S,GL_EYE_PLANE,Splane); //S, T, R and Q
// -- load and bind texture --
glEnable(GL_TEXTURE_GEN_S); //S, T, R and Q
// scale and bias
glMatrixMode(GL_TEXTURE);
glPushMatrix();
glLoadIdentity();
glTranslatef(0.5,0.5,0.0);
glScalef(0.5,0.5,1);
gluPerspective(cam._fov/ratio, ratio, 1, far_z);
gluLookAt(/* TO camera's parameters */);
glBegin(GL_QUADS);
glVertex3f(/* for each vertex */);
glEnd();
glDisable(GL_TEXTURE_GEN_S); //S, T, R and Q