我需要在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=-1
和far=+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坐标定义为正交矩阵的近值和远值之间