Проблема текстурирования OpenGL - PullRequest
1 голос
/ 11 декабря 2011

У меня странная проблема с некоторыми текстурами в opengl:

enter image description here

Эта сцена состоит из открытой коробки, состоящей из 4 текстурированных квадрик (пол и 3 стены) и нескольких сырых грибов, сделанных из gluSphere, которые были переведены, масштабированы и текстурированы соответственно.

Если вы посмотрите конкретно на пол, то увидите, что половина квадрики имеет массивную деформацию текстуры, я трижды проверил координаты текстуры для пола, и с ними, похоже, нет ничего плохого (как вы видно, что остальные три стены в порядке, и они следуют той же схеме, что и пол). Это происходит с любой текстурой, которую я использую (я просто использую данные RAW RGB).

Я убираю грибы со сцены, и деформация исчезает, это действительно странно. Кто-нибудь видел это раньше? Я относительно новичок в OpenGL, поэтому я не знал, что искать, когда я увидел это. Заранее спасибо.

Edit:

Код для коробки:

    void drawRoom(void) {
        glPushMatrix();
            glScalef(10,10,10);
            GLuint texture = LoadTextureRAW("cave_two.raw",1);
            glEnable(GL_TEXTURE_2D);
            glBegin(GL_QUADS);

            //Floor
            glVertex3f(-1,-1,-1); glTexCoord2f(0,0); glNormal3f(0,1,0);
            glVertex3f(1,-1,-1); glTexCoord2f(1,0); glNormal3f(0,1,0);
            glVertex3f(1,-1,1); glTexCoord2f(1.0,1.0); glNormal3f(0,1,0);
            glVertex3f(-1,-1,1); glTexCoord2f(0.0,1.0); glNormal3f(0,1,0);


            //Back wall
            glVertex3f(-1,-1,-1); glTexCoord2f(0,0); glNormal3f(0,0,1);
            glVertex3f(1,-1,-1); glTexCoord2f(1,0); glNormal3f(0,0,1);
            glVertex3f(1,1,-1); glTexCoord2f(1.0,1.0); glNormal3f(0,0,1);
            glVertex3f(-1,1,-1); glTexCoord2f(0.0,1.0); glNormal3f(0,0,1);

            //Right wall
            glVertex3f(1,1,1); glTexCoord2f(0,0); glNormal3f(-1,0,0);
            glVertex3f(1,-1,1); glTexCoord2f(1,0); glNormal3f(-1,0,0);
            glVertex3f(1,-1,-1); glTexCoord2f(1.0,1.0); glNormal3f(-1,0,0);
            glVertex3f(1,1,-1); glTexCoord2f(0.0,1.0); glNormal3f(-1,0,0);

            //Left wall
            glVertex3f(-1,1,1); glTexCoord2f(0,0); glNormal3f(1,0,0);
            glVertex3f(-1,-1,1); glTexCoord2f(1,0); glNormal3f(1,0,0);
            glVertex3f(-1,-1,-1); glTexCoord2f(1.0,1.0); glNormal3f(1,0,0);
            glVertex3f(-1,1,-1); glTexCoord2f(0.0,1.0); glNormal3f(1,0,0);

            glEnd();
            glDisable(GL_TEXTURE_2D);
            glDeleteTextures( 1, &texture );
        glPopMatrix();
        }

1 Ответ

1 голос
/ 11 декабря 2011

Не видя код, все, что мы можем сделать, это дикие догадки.Вот мой.

Я подозреваю, что вы сначала указываете вершину (glVertex*), а координаты текстуры для этой вершины - секунду (glTexCoord*).Это неправильный путь: текскорды становятся частью государства и применяются ко всем впоследствии нарисованным вершинам.С такой текстурой вы бы не заметили, что она на самом деле повернута на 90 градусов.

Кроме того, я подозреваю, что вы сначала рисуете грибы, а затем - коробку.Затем первая вершина ящика получает текстовую строку, которую последний гриб использовал в своей последней вершине, что оказалось неверным.Без шрумов он получает последнюю текстовую координату с последней грани бокса, которая оказалась правильной.

Возможно, вы захотите указать GL_LINEAR_MIPMAP_LINEAR вместо GL_LINEAR_MIPMAP_NEAREST, чтобы артефакты mipmapping исчезли, так кактеперь есть четкая грань между тем, где используются mipmap 0-го и 1-го уровня.

...