使用OpenGL的2D LWJGL - 启用深度测试以分层2D纹理?

时间:2012-04-01 04:02:49

标签: java opengl textures lwjgl depth-testing

我需要添加到OpenGL初始化方法以启用深度测试,我将如何将其用于纹理分层?

我必须将glOrtho的最后一个参数扩展到比-1更极端的东西,当然还有glEnable深度测试。然后使用它,我只能假设我将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 个答案:

答案 0 :(得分:1)

如果您的上下文包含深度缓冲区(不确定lwjgl缓冲区创建...)

你需要的只是:

  • 初始化期间致电glEnable(GL_DEPTH_TEST)
  • 将深度缓冲位添加到glClear glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  • 将z坐标定义为正交矩阵的近和远值。

答案 1 :(得分:1)

好像你换了近飞机和远飞机。看看gluOrtho2D。它只是使用glOrthonear=-1调用far=+1,从而产生z坐标切换符号(m33=-2/(far-near))。但是,使用上面给出的值,m33=-2/(-10-1)为正,z轴与标准工作流程相反。

从后面看四边形的这种后果。

OpenGL矩阵操作方法不关心你喂它们的是什么;除非值会导致除以零。

<小时/> 假设没有模型视图变换,只有一个矩阵有助于投影,我认为这是正在发生的事情:

从世界到NDC空间的z值变换是z_ndc = -9/11 * z_w + 2/11(设置在正交矩阵附近和远处,并取第三行)。现在,z_w=-2,以及z_ndc = 20/11。这是在NDC空间边界之外并被扔掉。

好吧,我假设使用Z测试本身隐式启用/禁用此测试。接下来的嫌疑人将被背面剔除......