прямоугольная текстура в OpenGL с шириной и высотой POT - PullRequest
2 голосов
/ 09 августа 2010

Я пытаюсь использовать прямоугольную текстуру с OpenGL. Когда высота равна ширине текстуры, все выглядит хорошо, однако, когда высота отличается от ширины, текстура выглядит искаженной.

Моя функция отображения (h и w - глобальные переменные, хранящие высоту и ширину изображения):

Обратите внимание, что размер нарисованного изображения не имеет значения. Он искажается независимо от фактического размера многоугольника.

void display(void)
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   glEnable(GL_TEXTURE_2D);
   glEnable(GL_BLEND);
   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
   glBindTexture(GL_TEXTURE_2D, texName);
   glTranslatef(-2.0f,-2.0f,0.0f);
   glScalef(1.0f/128.0f,1.0f/128.0f,1.0f);
   glBegin(GL_QUADS);
   glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.0, 0.0);
   glTexCoord2f(0.0, 1.0); glVertex3f(0.0, w, 0.0);
   glTexCoord2f(1.0, 1.0); glVertex3f(h, w, 0.0);
   glTexCoord2f(1.0, 0.0); glVertex3f(h, 0.0, 0.0);

   // Will be distorted also with the following:
   /*glScalef(1.0f/128.0f,1.0f/128.0f,1.0f);
   glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.0, 0.0);
   glTexCoord2f(0.0, 1.0); glVertex3f(0.0, h, 0.0);
   glTexCoord2f(1.0, 1.0); glVertex3f(w, h, 0.0);
   glTexCoord2f(1.0, 0.0); glVertex3f(w, 0.0, 0.0);*/

   glEnd();
   glFlush();
   glDisable(GL_TEXTURE_2D);
}

Я загружаю текстуру с:

void *data = LoadBMP("c:\\dev\\64x128_face.bmp");
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

glGenTextures(1, &texName);
glBindTexture(GL_TEXTURE_2D, texName);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
               GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
               GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w,
            h, 0, GL_RGBA, GL_UNSIGNED_BYTE,
            data);

Когда я загружаю 64x64 квадратное изображение текстуры, оно выглядит хорошо. Однако, когда я загружаю прямоугольное изображение текстуры, оно выглядит искаженным.

Как OpenGL поддерживает прямоугольную текстуру POT? Что не так с моим кодом?

Ответы [ 2 ]

0 голосов
/ 14 августа 2010

Возможно, вам следует проверить поддержку расширения GL_ARB_texture_non_power_of_two , прежде чем использовать значения не-степени двух для h и w в glTexImage2D () , потому что указание произвольной высоты и ширины допустимо только с этим расширением.

0 голосов
/ 09 августа 2010

Ваше прямоугольное изображение имеет размер 64x128, но вы отображаете его с помощью следующих команд:

   glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.0, 0.0);
   glTexCoord2f(0.0, 1.0); glVertex3f(0.0, w, 0.0);
   glTexCoord2f(1.0, 1.0); glVertex3f(h, w, 0.0);
   glTexCoord2f(1.0, 0.0); glVertex3f(h, 0.0, 0.0);

где h - высота (= 128), а w (= 64) - ширина.Но вы поместили высоту на х (которая является шириной) и ширину на у (которая является высотой).Может быть, попробуйте это вместо:

   glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.0, 0.0);
   glTexCoord2f(0.0, 1.0); glVertex3f(0.0, h, 0.0);
   glTexCoord2f(1.0, 1.0); glVertex3f(w, h, 0.0);
   glTexCoord2f(1.0, 0.0); glVertex3f(w, 0.0, 0.0);
...