2013-12-12 4 views
0

У меня есть 128 x 128 px 24 бит файла BMP для текстуры. Это зеленый квадрат с одной вертикальной линией. Он загружает OK с помощью stbi_image. В инициализации включеныТекстурирование OpenGL не работает, как должно быть

glEnable(GL_TEXTURE_2D); 
glEnable(GL_TEXTURE_GEN_S); 
glEnable(GL_TEXTURE_GEN_T); 

и параметры текстуры являются

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

У меня есть объект, который сделан с кубиками и цилиндров (и некоторых многоугольников с вершинами). Я связываю текстуру к одному, как это перенасыщения:

glPushMatrix(); 
glBindTexture(GL_TEXTURE_2D, tex1_id); 
glColor3f(0.0f, 1.0f, 0.0f); 
glTranslatef(-0.5f, 0.2f, 0.05f); 
glScalef(2.4f, 0.4f, 1.0f); 
glutSolidCube(0.6f); 
glBindTexture(GL_TEXTURE_2D, 0); 
glPopMatrix(); 

или к вершинам площади:

glPushMatrix(); 
glTranslatef(-0.03f, 1.26f, -0.35f); 
glRotatef(94, 1.0f, 0, 0); 
glBindTexture(GL_TEXTURE_2D, tex1); 
glBegin(GL_QUADS); 
glTexCoord2f(0.0f, 0.0f); 
glVertex3f(-0.3f, 0.4f, 0.0f); 
glTexCoord2f(0.0f, 1.0f); 
glVertex3f(-0.3f, 0.85f, 0.0f); 
glTexCoord2f(1.0f, 1.0f); 
glVertex3f(0.3f, 0.85f, 0.0f); 
glTexCoord2f(1.0f, 0.0f); 
glVertex3f(0.3f, 0.4f, 0.0f); 
glEnd(); 
glBindTexture(GL_TEXTURE_2D, 0); 
glPopMatrix(); 

Я знаю, что glutSolidCube не generete координаты текстуры, но по-видимому, с верхним glEnables он работает только хорошо. Таким образом, текстура появляется на объекте. В этот момент все выглядит хорошо.

Проблема начинается, когда я меняю вид с помощью lookAt или я переводю и поворачиваю объект по какой-либо траектории. Затем это выглядит так, как текстура не перемещается и не вращается с объектами, а остается неподвижной.

Problem Первый: начальный вид; Второй: слегка повернутый вид (lookAt); Третий: слегка переведенный объект

То же самое происходит, если я нарисую этот объект с вершинами. Я использую OpenGL 2.1 в C++ с избытком.

+1

Вы, кажется, сами идентифицировали проблему. Без текстурных координат, как он может отображать вершины в точку в текстуре? – Dave

+0

@Dave Я надеялся, что есть волшебный способ, который сделает это возможным. Твердый куб прост в применении, поэтому меня больше волнует реализация твердого цилиндра. Будет ли это работать, если я возьму реализацию glutSolidCylinder и поместит в нее некоторые текстурные координаты? –

ответ

0

Вы делаете неправильно. Вы должны определить координату текстуры. Нарисуйте куб, указав вершины и текстурные координаты самостоятельно.

//first face of cube 
glTexCoord2f(0.0, 0.0); 
glVertex3f(x, y, z); 
glTexCoord2f(1.0, 0.0); 
glVertex3f(x, y, z); 
glTexCoord2f(1.0, 1.0); 
glVertex3f(x, y, z); 
glTexCoord2f(0.0, 1.0); 
glVertex3f(x, y, z); 

//and so on for all six face of cube. 

Вы должны понимать, как работают координаты текстуры. Теперь, если вы хотите нарисовать цилиндр, воспользуйтесь gluCylinder функцией вида here для деталей. Вы можете сопоставить текстуру с изображением цилиндра, используя gluCylinder, используя функцию gluQuadricTexture, как показано ниже. Предположим, вы загрузили текстуру.

//Create the quadric object to render cylinder 
GLUquadric *quad; 
quad = gluNewQuadric(); 


glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, _textureId); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
gluQuadricTexture(quad,1); 
gluCylinder(quad,2,2,3,20,20); 

Вы можете найти аналогичный пример here.

+0

Возможно, я недостаточно хорошо описал свою проблему, поэтому я обновил свой вопрос. Путь с вершинами и добавление текстурных координат не влияет. –

+0

glutSolidCube - актуальная проблема. Он не создает координату текстуры, поэтому, если вы переводите или поворачиваете кубическую текстуру, она не будет транслироваться с кубом, а карта в другом положении. –

+0

Я знаю, я также модифицировал оригинальную функцию glutSolidCube и добавил туда текстуры текстуры. Нет эффекта. И даже если я рисую простой квадрат с 4 вершинами и координатами текстуры, он не работает. –

Смежные вопросы