我需要添加到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();
}
答案 0 :(得分:1)
如果您的上下文包含深度缓冲区(不确定lwjgl缓冲区创建...)
你需要的只是:
glEnable(GL_DEPTH_TEST)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
答案 1 :(得分:1)
好像你换了近飞机和远飞机。看看gluOrtho2D。它只是使用glOrtho
和near=-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测试本身隐式启用/禁用此测试。接下来的嫌疑人将被背面剔除......