Текстурирование LWJGL OpenGL неверно

Я пытаюсь сделать простую кнопку в OpenGL/LWJGL,

Я могу правильно визуализировать свой 2D QUAD, но когда я реализую текстуру, текстурируется только около 3/4 частей всего четырехугольника, например: https://dl.dropboxusercontent.com/u/60223805/glerror1.png

и если я удалю координаты текстуры, я получу это: https://dl.dropboxusercontent.com/u/60223805/glerror2.png

     none.bind();

     co.Enable2D_GUI();
     GL11.glBegin(GL11.GL_QUADS);
    GL11.glTexCoord2f(0, 0);
        GL11.glVertex2f(co.width/2-200, co.height/2);
    GL11.glTexCoord2f(1, 0);
        GL11.glVertex2f(co.width/2+none.getTextureWidth(),co.height/2);
    GL11.glTexCoord2f(1, 1);
        GL11.glVertex2f(co.width/2+none.getTextureWidth(), co.height/2+none.getTextureHeight());
    GL11.glTexCoord2f(0, 1);
        GL11.glVertex2f(co.width/2-200, co.height/2+none.getTextureHeight());
     GL11.glEnd();
     co.Disable2D_GUI();

где ни один из них не является текстурой (из библиотеки slick-util), а функции Enable2D_GUI и Disable2D_GUI просто включают и отключают ортогональное и прочее.

Что может быть не так? Я очень новичок в OpenGL, поэтому извините, если мой вопрос немного нубский

Это мои функции Enable2D_GUI и Disable2D_GUI:

    public void Enable2D_GUI() {

     GL11.glMatrixMode (GL11.GL_PROJECTION);
     GL11.glPushMatrix();
     GL11.glLoadIdentity ();
     GL11.glOrtho (0, width, height, 0, 1, -1);
     GL11.glDisable(GL11.GL_DEPTH_TEST);
     GL11.glMatrixMode (GL11.GL_MODELVIEW);
     GL11.glPushMatrix();
    GL11.glLoadIdentity();
}

public void Disable2D_GUI() {
    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glPopMatrix();
    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    GL11.glPopMatrix();

    GL11.glDisable(GL11.GL_BLEND);
    GL11.glEnable(GL11.GL_DEPTH_TEST);
}

Теперь, когда я тестирую его с помощью 3D QUAD, он тоже не работает, тот же результат. Это мой код инициализации OpenGL:

           GL11.glEnable(GL11.GL_TEXTURE_2D);
       GL11.glShadeModel(GL11.GL_SMOOTH);
       GL11.glClearColor(0f, 0.0f, 0.0f, 0.0f); 
       GL11.glClearDepth(1.0); 
       GL11.glEnable(GL11.GL_DEPTH_TEST);
       GL11.glDepthFunc(GL11.GL_LEQUAL); 

       GL11.glViewport(0, 0, width, height);

       GL11.glMatrixMode(GL11.GL_PROJECTION); 
       GL11.glLoadIdentity();

       GLU.gluPerspective(
             45.0f,
             (float)width/(float)height,
             0.5f,
             50.0f);


       GL11.glMatrixMode(GL11.GL_MODELVIEW);
       GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_NICEST);

person user1568364    schedule 09.08.2013    source источник
comment
Не могли бы вы также добавить фактический файл изображения текстуры?   -  person vallentin    schedule 09.08.2013
comment
Не могли бы вы тогда прокомментировать ссылку на изображение?   -  person vallentin    schedule 10.08.2013
comment
@Vallentin уверен: dl.dropboxusercontent.com/u/60223805/button_none.png   -  person user1568364    schedule 10.08.2013
comment
Итак, вы, должно быть, делаете что-то еще неправильно, потому что я только что использовал тот же код, что и вы, и это мой результат. gyazo.com/65dae85d4a4d9ed2064f1d2c590a605e.png   -  person vallentin    schedule 10.08.2013
comment
Хм. Хорошо, я проверю это более подробно и постараюсь найти решение   -  person user1568364    schedule 10.08.2013
comment
Тогда хорошо, но вы также можете опубликовать еще немного кода!   -  person vallentin    schedule 10.08.2013
comment
Конечно, ха-ха, я обновлю это.   -  person user1568364    schedule 11.08.2013
comment
Вы находите решение? @Валентин   -  person user1568364    schedule 12.08.2013
comment
Да, я только что нашел то, что сработало для меня! Публикация ответа сейчас!   -  person vallentin    schedule 12.08.2013


Ответы (1)


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

В вашем коде инициализации вам нужно изменить его на следующее.

GL11.glViewport(0, 0, width, height);

GL11.glMatrixMode(GL11.GL_PROJECTION); 
GL11.glLoadIdentity();

GLU.gluPerspective(45.0f, (float) width / (float) height, 0.5f, 50.0f);

GL11.glMatrixMode(GL11.GL_PROJECTION); 
GL11.glLoadIdentity();

GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glShadeModel(GL_SMOOTH);
GL11.glClearColor(0f, 0.0f, 0.0f, 0.0f);
GL11.glClearDepth(1.0);
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glDepthFunc(GL11.GL_LEQUAL);

Вам не нужно переключать состояния после glLoadMatrix и glLoadIdentity, хотя было бы лучше это сделать. 1 Код стал более читаемым. 2 Некоторые вещи сбрасываются после вызова glLoadIdentity, хотя это касается и самой Матрицы.

Затем вам также необходимо исправить ваши Enable2D_GUI и Disable2D_GUI следующим образом.

Включить2D_GUI

GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0, width, height, 0f, 1f, -1f);

GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glLoadIdentity();

GL11.glDisable(GL11.GL_DEPTH_TEST);

Отключить2D_GUI

GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();

GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glLoadIdentity();

GL11.glDisable(GL11.GL_BLEND);
GL11.glEnable(GL11.GL_DEPTH_TEST);

Насколько я знаю, вы не можете использовать glPushMatrix и glPopMatrix между вызовами glMatrixMode и glLoadIdentity. Я мог ошибаться Затем я также добавил вызовы glLoadIdentity вместо сброса матриц.

person vallentin    schedule 12.08.2013
comment
Я сейчас не дома, но дома попробую! Заранее спасибо! - person user1568364; 13.08.2013