Проецирование текстуры в OpenGL - PullRequest
7 голосов
/ 03 сентября 2010

ИСПРАВЛЕНО, установив возле плоскости отсечения значение 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

1 Ответ

4 голосов
/ 03 сентября 2010

Посмотрите документацию для glTexGen (в вашем случае вы хотите использовать GL_EYE_LINEAR вместе с соответствующим набором коэффициентов, как описано ниже) и glEnable (GL_TEXTURE_GEN_*).Когда вы включаете функцию texgen для определенных компонентов координат текстуры (S, T, R и / или Q), значения, которые вы указываете для этих компонентов (через glTexCoord), игнорируются, и вместо этого создаются координаты текстуры в соответствии с указанным glTexGen Режим.

При вычислении координат текстуры через GL_EYE_LINEAR координаты вершины сначала преобразуются в пространство глаза с помощью текущей матрицы GL_MODELVIEW.Оказавшись в пространстве глаза, для каждого включенного компонента (S, T, R, Q) координаты вершины преобразуются с помощью обратной матрицы GL_MODELVIEW, определенной во время вызова glTexGen, и точечного произведения.между полученными координатами и коэффициентами, отправленными на glTexGen, получается.Для каждого включенного компонента результирующие скалярные значения становятся соответствующими компонентами (S, T, R и / или Q) координат текстуры, которые в конечном итоге преобразуются матрицей GL_TEXTURE для получения окончательных координат текстуры.

Для каждого компонента текстуры коэффициенты (a, b, c, d), отправленные на glTexGen, определяют плоскость ax + на + cz + d = 0. Предполагая, что (a, b, c) является вектором единичной длинырезультат операции точечного произведения, описанный выше, представляет расстояние между этой плоскостью и обрабатываемой вершиной.Если GL_EYE_LINEAR включено для всех четырех компонентов текстуры, а уравнения плоскости для S, T, R и Q определяются соответственно как (1,0, 0,0, 0,0, 0,0), (0,0, 1,0, 0,0, 0,0), (0,0,0,0, 1,0, 0,0) и (0,0, 0,0, 0,0, 1,0), координаты текстуры, полученные для каждого компонента текстуры, в точности совпадают с исходными координатами вершины пространства объекта.Таким образом, матрица GL_TEXTURE должна содержать все необходимые операции для преобразования этих координат из пространства объектов в пространство текстур: моделирование , просмотр и проекция преобразования для преобразованияот координат объекта к нормализованным координатам устройства, а также scale и bias для преобразования из нормализованных координат устройства в текстурное пространство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...