2D LWJGL с OpenGL - Включить глубинное тестирование для наложения 2D текстур?

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

Мне бы пришлось расширить последний параметр glOrtho до чего-то более экстремального, чем -1, и, конечно, до глубокой проверки глубины. Затем, чтобы использовать его, я могу только предположить, что я изменил третий параметр glVertex на что-то, что не равно 0, чтобы отправить его впереди / позади других текстур.

Я пытаюсь это сделать, а проклятые текстуры даже не отображаются. xD Я должен что-то упустить.


РЕДАКТИРОВАТЬ: RE: Тим ответ

всякий раз, когда я делал изображение z более экстремальным, чем -1, оно не показывало, что экран был просто черным.

void initGL(){

GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glEnable(GL11.GL_DEPTH_TEST); //depth test enabled

    GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glOrtho(-width/2, width/2, -height/2, height/2, 1, -10);//far changed to -10
    GL11.glMatrixMode(GL11.GL_MODELVIEW);

}

а также

void loadBG(int theLoadedOne){

GL11.glBindTexture(GL11.GL_TEXTURE_2D, theLoadedOne);
GL11.glBegin(GL11.GL_QUADS);
    GL11.glTexCoord2f(0,0);
GL11.glVertex3f(-width/2,height/2, -2);//new z value

    GL11.glTexCoord2f(1,0);
GL11.glVertex3f(width/2,height/2,-2);//new z value

    GL11.glTexCoord2f(1,1);
GL11.glVertex3f(width/2,-height/2,-2);//new z value

    GL11.glTexCoord2f(0,1);
GL11.glVertex3f(-width/2,-height/2,-2);//new z value

GL11.glEnd();
GL11.glFlush();

}

а также

while(!Display.isCloseRequested()){
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);

...

            for(int i=0;i<1;i++){  //dont mind this for loop
                bg.loadThisBG(0);  //its here for reasons
            }
            updateFPS();

        Display.update();

    } Display.destroy();

}

2 ответа

Решение

Похоже, вы перешли ближний и дальний самолет. Посмотрите на gluOrtho2D. Это просто звонки glOrtho с near=-1 а также far=+1, в результате чего z-координаты переключения знака (m33=-2/(far-near)). Однако при значениях, приведенных выше, m33=-2/(-10-1) положительно, а ось z обращена к стандартному рабочему процессу.

Это последствия в квадрацикле, если смотреть со спины.

Методы манипулирования матрицей OpenGL не заботятся о том, что вы им кормите; кроме случаев, когда значения привели бы к делению на ноль.


Предполагая, что нет преобразования модели и существует только одна матрица, вносящая вклад в проекцию, вот что, я думаю, происходит:

Преобразование значения z из мира в пространство NDC z_ndc = -9/11 * z_w + 2/11 (установите близко и далеко в ортографическую матрицу и возьмите третий ряд). Сейчас, z_w=-2, так что z_ndc = 20/11, Это выходит за границы пространства НДЦ и выбрасывается.

Ну, я предполагаю, что этот тест неявно включен / отключен с помощью самого теста Z. Следующим подозреваемым будет выбраковка на задней стороне...

При условии, что ваш контекст включает буфер глубины (не уверен насчет создания буфера lwjgl...)

Все, что вам нужно, должно быть:

  • Вызов glEnable(GL_DEPTH_TEST) во время инициализации
  • Добавить бит буфера глубины в glClear glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  • Определите координату z, которая будет между ближним и дальним значениями ортогональной матрицы.
Другие вопросы по тегам