Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android OpenGLES2.0。安卓深度缓冲区的奇怪行为_Android_Opengl Es - Fatal编程技术网

Android OpenGLES2.0。安卓深度缓冲区的奇怪行为

Android OpenGLES2.0。安卓深度缓冲区的奇怪行为,android,opengl-es,Android,Opengl Es,我的Android应用程序显示了PowerVR SGX 544MP的意外行为 如果渲染设置为RENDERMODE_,则当_变脏时 但是,如果模式设置为 RENDERMODE_图纸右转: 错误结果: 正确结果: 仿真程序在这两种情况下都画对了 设备的默认缓冲区为24位,将缓冲区设置为相同 范围为仿真器16位未更改的图形。我试过不同的智慧 投影矩阵的“近”和“远”值,但不成功 我的矩阵中只有一个具有近平面的修改 martix可能会在深度缓冲区中生成错误数据。我关掉电源 在使用此矩阵绘制之前写入深

我的Android应用程序显示了PowerVR SGX 544MP的意外行为

如果渲染设置为RENDERMODE_,则当_变脏时 但是,如果模式设置为 RENDERMODE_图纸右转: 错误结果:

正确结果: 仿真程序在这两种情况下都画对了

设备的默认缓冲区为24位,将缓冲区设置为相同 范围为仿真器16位未更改的图形。我试过不同的智慧 投影矩阵的“近”和“远”值,但不成功

我的矩阵中只有一个具有近平面的修改 martix可能会在深度缓冲区中生成错误数据。我关掉电源 在使用此矩阵绘制之前写入深度缓冲区。因为 在这种情况下,我在调用之前将GLES20.glDepthMask设置为false 元素

初始化OPENGL ES和使用VBOs对我来说都是新鲜事,所以也许我对麻烦的误解比我想象的更深刻。 我发送到统一的不同矩阵值,并使用相同的VBO绘制。 我只对属性全局启用一次,以后不会对它们使用“禁用”。 //MyGleView 公共MyGLSurfaceViewContext上下文{ 超级上下文; setEGLContextClientVersion2; //super.setEGLConfigChooser8,8,8,8,16,0;//结果相同 mRenderer=新的myglrendercontext; setrendermrrenderer; 连续设置RenderModeglSurfaceView.RENDERMODE_; } //mygl渲染器 @凌驾 在SurfaceCreateDGL10未使用的公用void,EGLConfig配置{ GLES20.glClearColor0.1f、0.2f、0.3f、1.0f; GLES20.glEnableGLES20.GL_混合物; GLES20.glBlendEquationGLES20.GL_FUNC_ADD; GLES20.GlenableS20.GL_深度试验; GLES20.Gldeptrangef0.f,1.f; GLES20.glClearDepthf1.f; GLES20.GlenableS20.GL_CULL_面; GLES20.glFrontFaceGLES20.GL_CCW; GLES20.gldepthfungles20.GL_LEQUAL; } @凌驾 表面上的公共空白更改dgl10未使用,整型宽度,整型高度{ //根据几何体更改调整视口, //例如屏幕旋转 GLES20.glViewport0,0,宽度,高度; 浮动比率=浮动宽度/高度; 透视视场RHM投影矩阵,0,28.4f,比率,0.4f,28.f; } @凌驾 公共无效onDrawFrameGL10未使用{ GLES20.glDepthMask true; GLES20.GLCLEARS20.GL_颜色_缓冲_位| GLES20.GL_深度_缓冲_位; int i,j; //关闭书写,只阅读 GLES20.glDepthMask false; GLES20.glBlendFuncGLES20.Glu一,GLES20.Glu零; GLES20.glUseProgramprg_shaderCube; //使用修改的投影矩阵绘制: 对于i=0;i<4;i++{ 对于j=0;j<6;j++{ 阵列光学面矩阵[i][j],0,mModelMatrix,0,16; mModelMatrix[14]=翻译[i]; Matrix.MultiplyMMMirrorFlankViewProjectionWithClippingMap,0,MMErrorFlankViewProjectionWithClippingMatrix,0,mModelMatrix,0; GLES20.glUniformMatrix4fvu变更矩阵立方,1,假,带剪报的mMirrorflank GMVP,0; GLES20.glUniformMatrix4fvu_modelmatrixCube,1,false,mModelMatrix,0; GLES20.glCullFaceGLES20.GLU背面; 开关模式[i][j]{ 案例0: GLES20.glBindBufferGLES20.GL_数组_缓冲区,vbo[0]; GLES20.GLVERTEXATTributePointerATR_位置_立方体,3,GLES20.GLu浮动,false,水平方向的跨步,0; GLES20.glvertexattributepointertr_color_cube,3,GLES20.GL_FLOAT,false,step_IN_FLAT,12; GLES20.glvertexattributepointertr_normal_cube,3,GLES20.GL_FLOAT,false,step_IN_FLAT,24; GLES20.glBindBufferGLES20.GL_元素_数组_缓冲区,ibo[0]; GLES20.GlDrawerElementsGles20.GL_三角形,capacityFlat1,GLES20.GL_UNSIGNED_SHORT,0; 打破 案例1: GLES20.glBindBufferGLES20.GL_数组_缓冲区,vbo[1]; .... 打破 .... .... } } } //其他 GLES20.glDepthMask true; 对于i=3;i>=0;i-{ 对于j=0;j<6;j++{ 阵列光学面矩阵[i][j],0,mModelMatrix,0,16; mModelMatrix[14]=翻译[i]; Matrix.MultipleMMMirrorFlankViewProjectionMatrix,0,MMErrorFlankViewProjectionMatrix,0,mModelMatrix,0; Matrix.MultipleMMMirrorDownMVP,0,mmErrorDownViewProjectionMatrix,0,mModelMatrix,0; 矩阵.multipleymmmmvp,0,mViewMatrix,0,mModelMatrix,0; GLES20.glUniformMatrix4fvu_modelmatrixCube,1,false,mModelMatrix,0; 开关模式[i][j]{ 案例0: GLES20.glBi ndBufferGLES20.GL_数组_缓冲区,vbo[0]; GLES20.GLVERTEXATTributePointerATR_位置_立方体,3,GLES20.GLu浮动,false,水平方向的跨步,0; GLES20.glvertexattributepointertr_color_cube,3,GLES20.GL_FLOAT,false,step_IN_FLAT,12; GLES20.glvertexattributepointertr_normal_cube,3,GLES20.GL_FLOAT,false,step_IN_FLAT,24; GLES20.glBindBufferGLES20.GL_元素_数组_缓冲区,ibo[0]; GLES20.glCullFaceGLES20.GLU前; GLES20.glUniformMatrix4fvu_变化矩阵立方,1,假,mMirrorFlankMVP,0; GLES20.GlDrawerElementsGles20.GL_三角形,capacityFlat1,GLES20.GL_UNSIGNED_SHORT,0; GLES20.glUniformMatrix4fvu_changematrixCube,1,false,mMirrorDownMVP,0; GLES20.GlDrawerElementsGles20.GL_三角形,capacityFlat1,GLES20.GL_UNSIGNED_SHORT,0; GLES20.glCullFaceGLES20.GLU背面; GLES20.glUniformMatrix4fvu_变化矩阵立方,1,假,mMVP,0; GLES20.GlDrawerElementsGles20.GL_三角形,capacityFlat1,GLES20.GL_UNSIGNED_SHORT,0; 打破 案例1: GLES20.glBindBufferGLES20.GL_数组_缓冲区,vbo[1]; .... 打破 .... .... } } } }
我更喜欢在模式RENDERMODE_脏的时候工作,我想了解我的深度缓冲区发生了什么

下面的答案并不像我通常希望的那样具有决定性。特别是,我无法解释为什么在RENDERMODE_脏的情况下,RENDERMODE_和RENDERMODE_之间的行为会有所不同。但你的问题中有一点值得解释

我的矩阵中只有一个具有近平面的修改。矩阵可能会在深度缓冲区中生成错误数据

你在这里必须非常小心。近平面和远平面之间的范围将映射到深度缓冲区的范围。因此,如果使用标准投影矩阵,并更改近平面,此贴图将更改

换句话说,假设您使用眼睛坐标中给定z值处的顶点进行渲染,而投影矩阵的近似值设置为near1。现在,将投影矩阵设置为“近”值“近2”,并使用具有相同z值的顶点。该顶点现在将映射到不同的深度缓冲区值。因此,根据您的投影,相同的顶点将映射到不同的深度缓冲区值。或者,由于更改了投影矩阵,距离摄影机较远的顶点最终可能具有较小的“较近深度缓冲区”值

您可以通过相应地设置深度范围来尝试对此进行补偿。但是,如果使用透视投影,这似乎很棘手,因为眼睛空间深度到深度缓冲区值的映射不是线性的


如果需要剪裁某些几何体的近距离部分,最好保持投影矩阵不变,并显式剪裁。OpenGL ES不支持任意剪辑平面,因此最简单的方法是将距离传递到片段着色器,并在那里丢弃剪辑片段。或者,如果可能的话,请在应用程序代码中添加逻辑,以避免渲染将被剪裁的几何体。

添加调用glSurfaceView.requestRender可提高性能。我对深度缓冲区的关注偏离了问题的真正原因。

我编辑了您的问题,将图像包括在内,但将以>开头的文本括起来。。。让我很难阅读。这些是为引用其他来源而设计的。你可能会考虑编辑问题的部分来使用标题,例如副标题。你有没有尝试过其他Android设备,比如ADRANGPU设备?在我的理解中,持续和WHEN_DIRTY之间的区别只是调用eglSwapBuffers的时间。听起来是PowerVR驱动程序问题。•GPU Adreno 205没有这个问题