3

我需要在我的 OpenGL 初始化方法中添加什么来启用深度测试,以及我将如何实际使用它来进行纹理分层?

我必须将 glOrtho 的最后一个参数扩展到比 -1 更极端的值,当然还有 glEnable 深度测试。然后要使用它,我只能假设我将 glVertex 的第三个参数更改为不为 0 的值,以将其发送到其他纹理的前面/后面。

我试试这个,该死的纹理甚至不显示。xD 我一定是错过了什么。


编辑:回复:蒂姆的回应

每当我使图像的 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();

}
4

2 回答 2

1

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

您所需要的应该是:

  • glEnable(GL_DEPTH_TEST)初始化期间调用
  • 将深度缓冲区位添加到 glClearglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  • 将 z 坐标定义为正交矩阵的近值和远值之间。
于 2012-04-03T04:41:59.547 回答
1

好像你切换了近平面和远平面。看看gluOrtho2DglOrtho它只是用near=-1and调用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 测试本身隐式启用/禁用的。下一个嫌疑人将是背面剔除......

于 2012-04-04T04:21:49.967 回答