我正在尝试学习OpenGL ES 2.0,然后我开始在Android上加载3D模型。我现在可以正确加载模型纹理,但我在显示深度上有问题。当我将模型置于透视中,并且模型的一部分被其他部分隐藏时,在我看来,在另一个绘制之前有一个或两个三角形,这是我通过某些部分看到的。
我尝试setEGLConfigChooser(8,8,8,8,16,0);和(8,8,8,8,24,0),但我的问题仍然是一样的,除了我放(8,8,8,8,24,0)并显示更好的定义,但当3d物体移动,颜色产生一个令我不安的频闪效果。
我也尝试glDepthFunc函数(GL_LEQUAL);使用glEnable(GL_DEPTH_TEST),但这并不能解决我的问题。
这是问题的图片:
问题:链接已损坏
好处:链接坏了
对不起我的链接图片,我在这个问题上发布图片的声誉不超过10个。
这是我的代码 我的GLSurfaceView
public MyGLSurfaceView(Context context) {
super(context);
this.context = context;
setEGLContextClientVersion(2);
setEGLConfigChooser(true);
//setZOrderOnTop(true);
//setEGLConfigChooser(8, 8, 8, 8, 16, 0);
//setEGLConfigChooser(8, 8, 8, 8, 24, 0);
//getHolder().setFormat(PixelFormat.RGBA_8888);
mRenderer = new Renderer(context);
setRenderer(mRenderer);
}
我的渲染器
@Override
public void onSurfaceCreated(GL10 glUnused, EGLConfig config) {
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glFrontFace(GL_CCW);
glEnable(GL_DEPTH_TEST);
mushroom = new Mushroom();
textureProgram = new TextureShaderProgram(context);
texture = TextureHelper.loadTexture(context, R.drawable.mushroom);
}
@Override
public void onSurfaceChanged(GL10 glUnused, int width, int height) {
glViewport(0, 0, width, height);
MatrixHelper.perspectiveM(projectionMatrix, 45, (float) width
/ (float) height, 0f, 10f);
setLookAtM(viewMatrix, 0, 0f, 1.2f, -10.2f, 0f, 0f, 0f, 0f, 1f, 0f);
}
@Override
public void onDrawFrame(GL10 glUnused) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
multiplyMM(viewProjectionMatrix, 0, projectionMatrix, 0, viewMatrix, 0);
glDepthFunc(GL_LEQUAL);
//glDepthMask(true);
positionMushroomInScene();
textureProgram.useProgram();
textureProgram.setUniforms(modelViewProjectionMatrix, texture);
mushroom.bindData(textureProgram);
mushroom.draw();
//glDepthFunc(GL_LESS);
}
private void positionMushroomInScene() {
setIdentityM(modelMatrix, 0);
translateM(modelMatrix, 0, 0f, 0f, 5f);
rotateM(modelMatrix, 0, -yRotation, 1f, 0f, 0f);
rotateM(modelMatrix, 0, xRotation, 0f, 1f, 0f);
multiplyMM(modelViewProjectionMatrix, 0, viewProjectionMatrix,
0, modelMatrix, 0);
}
我的矩阵助手
public static void perspectiveM(float[] m, float yFovInDegrees, float aspect, float n, float f) {
final float angleInRadians = (float) (yFovInDegrees * Math.PI / 180.0);
final float a = (float) (1.0 / Math.tan(angleInRadians / 2.0));
m[0] = a / aspect;
m[1] = 0f;
m[2] = 0f;
m[3] = 0f;
m[4] = 0f;
m[5] = a;
m[6] = 0f;
m[7] = 0f;
m[8] = 0f;
m[9] = 0f;
m[10] = -((f + n) / (f - n));
m[11] = -1f;
m[12] = 0f;
m[13] = 0f;
m[14] = -((2f * f * n) / (f - n));
m[15] = 0f;
}
答案 0 :(得分:0)
问题很可能与设置投影矩阵的方式有关:
MatrixHelper.perspectiveM(projectionMatrix, 45, (float) width
/ (float) height, 0f, 10f);
你定义这个函数的第四个参数是近平面。该值不应为0.0。它通常应该是远距离的合理分数。选择理想值可能有点权衡。 far / near
越大,得到的深度精度越低。另一方面,如果将near
值设置得过大,则可能会削减您实际想要查看的近似几何体。
far / near
的比率可能为100或1000,通常可以给出合理的深度精度,而不会出现不希望的前剪裁。如果使用16位深度缓冲区,则需要比使用24位深度缓冲区时更加保守。
出于您的目的,请尝试将near
更改为0.1,并查看其效果如何:
MatrixHelper.perspectiveM(projectionMatrix, 45, (float) width
/ (float) height, 0.1f, 10f);