Проецирование текстуры в OpenGL

ИСПРАВЛЕНО, установив возле плоскости отсечения значение 1, а не 0 (не уверен, почему это было так для начала). См. Вопрос о скелетном коде и ответ Адриана о том, как и почему это работает.

У меня есть несколько разных положений камеры, и моя сцена состоит из одного четырехугольника.

Квадрат таков, что он проецируется точно на Окно просмотра / окно в первом кадре. Я хочу проецировать текстуру с этой позиции камеры на квад. Текстура также точно покрывает область просмотра.

Первое, что я сделал, было

    // GL_QUADS...
    glTexCoord2f( /*one corner of s,t space*/);
    glVertex3f(/* appropriate vertex */);;

и в итоге получилось что-то вроде (картинка не моя) alt text

И затем я понял, что да, конечно, это должно быть проективное преобразование. Согласно этим примечаниям :

  1. Преобразование вида модели для ориентации проекции на сцене.
  2. Проективное преобразование (перспективное или ортогональное).
  3. Масштаб и смещение для сопоставления ближней плоскости отсечения в текстурные координаты.

Теперь, когда все работает, вот примерная реализация кода:

// 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

7
задан CakeMaster 4 September 2010 в 17:46
поделиться