Проблема с текстурами в OpenGL
От: igor_zaicev  
Дата: 30.01.07 10:50
Оценка:
Доброго времени суток! Работаю с OpenGL в VisualStudio 2005, дошел до наложения текстур и наткнулся на интересный баг:

где-то при инициализации загружаю текстуру:

clock_image = auxDIBImageLoadA("Часы.bmp");
glGenTextures(1, &clock_tex);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,
(float)GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
(float)GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
(float)GL_MODULATE);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3,
clock_image->sizeX,
clock_image->sizeY,
GL_RGB, GL_UNSIGNED_BYTE,
clock_image->data);

В DrawScene() накладываю текстуру на прямоугольник:

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, clock_tex );
glBegin(GL_QUADS);
glVertex3f( -1.0f, -1.0f, 0.0f);glTexCoord2d(0,0); // Слева внизу
glVertex3f( 1.0f, -1.0f, 0.0f);glTexCoord2d(1,0); // справа внизу
glVertex3f( 1.0f, 1.0f, 0.0f);glTexCoord2d(1,1); // Справа вверху
glVertex3f( -1.0f, 1.0f, 0.0f);glTexCoord2d(0,1);// слева вверху
glEnd();

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

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, clock_tex );
glBegin(GL_TRIANGLES);
glVertex3f( -1.0f, -1.0f, 0.0f);glTexCoord2d(0,0);
glVertex3f( 1.0f, -1.0f, 0.0f);glTexCoord2d(1,0);
glVertex3f( 1.0f, 1.0f, 0.0f);glTexCoord2d(1,1);

glVertex3f( 1.0f, 1.0f, 0.0f); glTexCoord2d(1,1);
glVertex3f( -1.0f, 1.0f, 0.0f);glTexCoord2d(0,1);
glVertex3f( -1.0f, -1.0f, 0.0f);glTexCoord2d(0,0);
glEnd();


glDisable(GL_TEXTURE_2D);

текстура накладывается криво, в чем ошибка ???
Re: Проблема с текстурами в OpenGL
От: Рома Мик Россия http://romamik.com
Дата: 30.01.07 11:56
Оценка: +1
Здравствуйте, igor_zaicev, Вы писали:
_>glBegin(GL_QUADS);
_> glVertex3f( -1.0f, -1.0f, 0.0f);glTexCoord2d(0,0); // Слева внизу
_> glVertex3f( 1.0f, -1.0f, 0.0f);glTexCoord2d(1,0); // справа внизу
_> glVertex3f( 1.0f, 1.0f, 0.0f);glTexCoord2d(1,1); // Справа вверху
_> glVertex3f( -1.0f, 1.0f, 0.0f);glTexCoord2d(0,1);// слева вверху
_>glEnd();

_>Все замечательно, однако после разбиения прямоугольника на два треугольника:


_>glEnable(GL_TEXTURE_2D);

_>glBindTexture(GL_TEXTURE_2D, clock_tex );
_>glBegin(GL_TRIANGLES);
_> glVertex3f( -1.0f, -1.0f, 0.0f);glTexCoord2d(0,0);
_> glVertex3f( 1.0f, -1.0f, 0.0f);glTexCoord2d(1,0);
_> glVertex3f( 1.0f, 1.0f, 0.0f);glTexCoord2d(1,1);

_> glVertex3f( 1.0f, 1.0f, 0.0f); glTexCoord2d(1,1);

_> glVertex3f( -1.0f, 1.0f, 0.0f);glTexCoord2d(0,1);
_> glVertex3f( -1.0f, -1.0f, 0.0f);glTexCoord2d(0,0);
_>glEnd();


_>glDisable(GL_TEXTURE_2D);


_>текстура накладывается криво, в чем ошибка ???

Я так думаю в том, что надо вначале установить текстурные координаты, а потом уже вызывать glVertex. Потому как ты вначале все устанавливаешь, а потом вызовом glVertex всё это дело как бы коммиттишь. Хотя честно говоря в код не вникал вообще, просто предположение, основанное на способе форматирования кода.
Re: Проблема с текстурами в OpenGL
От: Tilir Россия http://tilir.livejournal.com
Дата: 01.02.07 12:49
Оценка:
Здравствуйте, igor_zaicev, Вы писали:

_>Доброго времени суток! Работаю с OpenGL в VisualStudio 2005, дошел до наложения текстур и наткнулся на интересный баг:


_>где-то при инициализации загружаю текстуру:


glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, clock_tex );
glBegin(GL_TRIANGLE_STRIP);
  glTexCoord2f(0.0, 0.0);
  glVertex2f( -1.0f, -1.0f);
  glTexCoord2f(1.0, 0.0);
  glVertex2f( 1.0f, -1.0f);
  glTexCoord2f(0.0, 1.0);
  glVertex2f( -1.0f, 1.0f);
  glTexCoord2f(1.0, 1.0);
  glVertex2f( 1.0f, 1.0f);
glEnd();
glDisable(GL_TEXTURE_2D);


>> текстура накладывается криво, в чем ошибка ???


1) Ошибка в том, что криво указываете текстурные координаты. Вы их и для четырёхугольника-то указываете неверно (они должны быть до glVertex, поскольку это атрибут вершины). Но с четырёхугольником вам почему-то повезло. Лично мне непонятно почему, единственный вариант — у вас текстура типа "шахматной доски" и вы не заметили, что она идёт "боком".

2) Почему glTexCoord2d? Относительные размеры от 0.0 до 1.0 указываются в glTexCoord2f

3) Кто же это так бьёт на треугольники? Бьют trianglestrip'ом (как я показал) или trianglefan'ом иначе вместо выигрыша по эффективности вы получите потерю её.

4) У вас z-координата всё время нулевая. Поэтому можно обойтись glVertex2f.

Корректный код я привёл, попробуйте.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.