ИСПРАВЛЕНО, установив возле плоскости отсечения значение 1, а не 0 (не уверен, почему это было так для начала). См. Вопрос о скелетном коде и ответ Адриана о том, как и почему это работает.
У меня есть несколько разных положений камеры, и моя сцена состоит из одного четырехугольника.
Квадрат таков, что он проецируется точно на Окно просмотра / окно в первом кадре. Я хочу проецировать текстуру с этой позиции камеры на квад. Текстура также точно покрывает область просмотра.
Первое, что я сделал, было
// 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