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

Что мне нужно добавить к моему методу инициализации 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 ]

1 голос
/ 04 апреля 2012

Похоже, вы перешли ближний и дальний самолет. Посмотрите на 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-тестом. Следующим подозреваемым будет выбраковка на задней стороне ...

1 голос
/ 03 апреля 2012

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

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

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