我正在尝试使用OpenGL创建模型,并尝试启用深度测试。
我在@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new HomeFragment();
case 1:
return new CategoryFragment();
case 2:
Intent intent = new Intent(context, AddProdActivity.class);
startActivity(intent);
return new AddProdFragment();
case 3:
return new MyProdFragment();
case 4:
return new MyProfileFragment();
default:
return null;
}
}
:
main
这在我的展示中:
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glEnable(GL_DEPTH_TEST);
我甚至尝试添加:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
它不起作用。我仍然可以看到我认为深度问题。 以下是显示问题的视频:https://www.youtube.com/watch?v=OafrRH4Mzjc
我错过了什么?
编辑:复制的最小示例文件:
glDepthFunc(GL_LEQUAL);
答案 0 :(得分:3)
gluPerspective(50, width / height, 0, 20);
^ wat
zNear
需要greater than zero(强调我的):
深度缓冲区精度受
zNear
指定值的影响 和zFar
。zFar
与zNear
的比率越大,越少 有效的深度缓冲区将区分表面 彼此靠近。如果
r = zFar / zNear
需要log2(r)
位深度缓冲区 精度丢失了。由于zr
接近无穷大,因为zNear接近0, zNear绝不能设置为0。
编辑:鉴于新发布的MCVE:
int main(int argc, char **argv) {
/* Creation of the window */
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(900, 600);
glEnable(GL_DEPTH_TEST); // too soon
glutCreateWindow("Chess");
...
}
就像datenwolf said一样:在您拥有当前的GL上下文之前,您需要glEnable()
glutCreateWindow()
创建上下文并使其成为当前状态。
不要在 gl*()
之后调用任何glutCreateWindow()
个函数。
答案 1 :(得分:0)
public void onSurfaceChanged(int w, int h)
{
Matrix.frustumM(projectionMatrix,0,-(9f/18.5f),(9f/18.5f),-1f,1f,1.0f,1000f);
}
我不得不将我的近剪裁形式从 0.01f 更改为 1.0f。