带OpenGL的2D LWJGL-实现对2D纹理分层的深度测试



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

我必须将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();
}

似乎您切换了近平面和远平面。看看gluOrtho2D。它只是用near=-1far=+1调用glOrtho,导致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测试本身隐式启用/禁用的。下一个嫌疑人将是背面扑杀。。。

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

你所需要的应该是:

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

相关内容

  • 没有找到相关文章

最新更新