Sign in to follow this  
buddysk

OpenGL Z-Buffer Issues on Android

Recommended Posts

buddysk    127
[i][b]Hi there![/b][/i]

I am facing a problem on an Android Application using GLSurfaceView.
The problem seems to happen only, when quite alot of objects are drawn.
Although most of the time, the depth test seems to work, there are some positions of the camera, when glitches appear. That is, objects in the back appear infront of nearer objects.

In order to track the problem, i visualized the depths (gl_FragCoord.z) within the pixel shader (z, pow(z,20), pow(z,80)). (the whiter the further away, red = really near)
Here is a combined image to show the problem. (alot of jeeps aligned in a x,z grid with a plane as bottom)
On the left all is working fine. The mid shows the "bug", the right image is the visualization of the fragment.z value for the mid image.

[img]http://www.eyedbits.com/upload/depthbufferproblem.png[/img]


The fragment depths seems to be OK, but not properly used for visibility determination.
Is it possible, that the z-buffer gets corrupt/overflown/deactivated somehow?
Can a low framerate lead to a silent disabling of the depthbuffer?

Z-Fighting does only appear between objects that are near to each other, right? So in general a far away object should still not appear in front of a near one?

I don't know if it is a problem within my camera implementation, an android specific problem, or a general opengl thing.
Any help is appreciated :-)

[b][i]buddysk[/i][/b]


(The quadMesh on the floor is 40x40 centered around 0, near plane 0.1, far plane 100 (problem also appears for nearplan 1, far plane 1000))

(I sometimes notice, that a frame changes between the first draw and the succeeding ones. Is openGL allowed to drop drawing calls? And I "remember" to have once read that it is not guaranteed, that all drawing commands are executed within one batch?! Maybe there are two frames rendered and combined afterwards?! (just a wild guess))

Share this post


Link to post
Share on other sites
buddysk    127
Yes sorry, I must admit the images look quite chaotic. But when I reduce the amount of cars, the problem does not seem to happen.
The weird thing is, that it is always whole objects, that pop up in front of the others that are really near, so I don't think it is a pure precision problem.

It also seems to be always the latest objects that are rendered. When I render the base plate before the cars, it does not pop up.
Every object is drawn using GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, _numVertices);

Maybe something like double buffering out of sync or clearing/loosing the depth buffer during rendering when the rendering call takes to long or the "pipeline" is filled up? Well sounds unlikely ...

Maybe this image does illustrate the problem better: See the left lane of cars popping up in front although they should be hidden.
Also note the car in the middle lane pop up in front.

[img]http://www.eyedbits.com/upload/depthbufferproblem2.png[/img]

Share this post


Link to post
Share on other sites
buddysk    127
In the onCreate method of my Activity I only call
[source lang="java"]_glView = new GLSurfaceView(this);
_glView.setEGLContextClientVersion(2);
_glView.setRenderer(this);[/source]

When I query in onSurfaceCreated (like
[source lang="java"]GLES20.glGetIntegerv(GLES20.GL_DEPTH_BITS, tempInt, 0)[/source]
...), I get the following values:

GL_DEPTH_BITS = 24
GL_DEPTH_RANGE = 0,000000, 1,000000
GL_DEPTH_TEST = 1

Share this post


Link to post
Share on other sites
alh420    5995
Are you sure you aren't accidentally disabling depth test, or clear the z-buffer between draw calls?

I agree it does not look like a precision problem, it looks like the zbuffer or the test is somehow switched off completely.

Though it does look like it might work within the object itself, thats what lead me to think that the z-buffer might be cleared between draw calls. Edited by Olof Hedman

Share this post


Link to post
Share on other sites
buddysk    127
Thanks for the answers!

@Katie:
I currently have no other android device for testing. At the moment I am running it on a Samsung Galaxy S i9000.

@Olof Hedman:
I was looking for glClear in my whole project code. I am only calling it once, in onDraw and in the form of:
[source lang="java"]GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);[/source]
Sadly I dont know how to log all gl calls, in order to verify there is no implicit glClear inbetween.
[source lang="java"] _glView.setDebugFlags(debugFlags |
android.opengl.GLSurfaceView.DEBUG_CHECK_GL_ERROR |
android.opengl.GLSurfaceView.DEBUG_LOG_GL_CALLS);[/source]
seems not to work for OpenGL ES 2.0, and the [url="http://developer.android.com/tools/help/gltracer.html"]GLTracer tool[/url] is only supported by Android 4.1 and higher.
I will try to get some other device to test it on.

Share this post


Link to post
Share on other sites
buddysk    127
I only have one glDepthMask call at the beginning, and I set the comparison function to GL_LEQUAL.

I now tried different shaders for visualizing the depth:

One vertex shader A only calculated the gl_position.
The other vertex shader B also assigned a texCoord attribute to a varying.
This is more or less the only difference between!!

While shader B shows the artifacts, shader A doesnt ....
I can switch between the two shaders and see the artifacts present a not ...

Really seems to be some kind of memory thing?!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Similar Content

    • By povilaslt2
      Hello. I'm Programmer who is in search of 2D game project who preferably uses OpenGL and C++. You can see my projects in GitHub. Project genre doesn't matter (except MMO's :D).
    • By ZeldaFan555
      Hello, My name is Matt. I am a programmer. I mostly use Java, but can use C++ and various other languages. I'm looking for someone to partner up with for random projects, preferably using OpenGL, though I'd be open to just about anything. If you're interested you can contact me on Skype or on here, thank you!
      Skype: Mangodoor408
    • By tyhender
      Hello, my name is Mark. I'm hobby programmer. 
      So recently,I thought that it's good idea to find people to create a full 3D engine. I'm looking for people experienced in scripting 3D shaders and implementing physics into engine(game)(we are going to use the React physics engine). 
      And,ye,no money =D I'm just looking for hobbyists that will be proud of their work. If engine(or game) will have financial succes,well,then maybe =D
      Sorry for late replies.
      I mostly give more information when people PM me,but this post is REALLY short,even for me =D
      So here's few more points:
      Engine will use openGL and SDL for graphics. It will use React3D physics library for physics simulation. Engine(most probably,atleast for the first part) won't have graphical fron-end,it will be a framework . I think final engine should be enough to set up an FPS in a couple of minutes. A bit about my self:
      I've been programming for 7 years total. I learned very slowly it as "secondary interesting thing" for like 3 years, but then began to script more seriously.  My primary language is C++,which we are going to use for the engine. Yes,I did 3D graphics with physics simulation before. No, my portfolio isn't very impressive. I'm working on that No,I wasn't employed officially. If anybody need to know more PM me. 
       
    • By Zaphyk
      I am developing my engine using the OpenGL 3.3 compatibility profile. It runs as expected on my NVIDIA card and on my Intel Card however when I tried it on an AMD setup it ran 3 times worse than on the other setups. Could this be a AMD driver thing or is this probably a problem with my OGL code? Could a different code standard create such bad performance?
    • By Kjell Andersson
      I'm trying to get some legacy OpenGL code to run with a shader pipeline,
      The legacy code uses glVertexPointer(), glColorPointer(), glNormalPointer() and glTexCoordPointer() to supply the vertex information.
      I know that it should be using setVertexAttribPointer() etc to clearly define the layout but that is not an option right now since the legacy code can't be modified to that extent.
      I've got a version 330 vertex shader to somewhat work:
      #version 330 uniform mat4 osg_ModelViewProjectionMatrix; uniform mat4 osg_ModelViewMatrix; layout(location = 0) in vec4 Vertex; layout(location = 2) in vec4 Normal; // Velocity layout(location = 3) in vec3 TexCoord; // TODO: is this the right layout location? out VertexData { vec4 color; vec3 velocity; float size; } VertexOut; void main(void) { vec4 p0 = Vertex; vec4 p1 = Vertex + vec4(Normal.x, Normal.y, Normal.z, 0.0f); vec3 velocity = (osg_ModelViewProjectionMatrix * p1 - osg_ModelViewProjectionMatrix * p0).xyz; VertexOut.velocity = velocity; VertexOut.size = TexCoord.y; gl_Position = osg_ModelViewMatrix * Vertex; } What works is the Vertex and Normal information that the legacy C++ OpenGL code seem to provide in layout location 0 and 2. This is fine.
      What I'm not getting to work is the TexCoord information that is supplied by a glTexCoordPointer() call in C++.
      Question:
      What layout location is the old standard pipeline using for glTexCoordPointer()? Or is this undefined?
       
      Side note: I'm trying to get an OpenSceneGraph 3.4.0 particle system to use custom vertex, geometry and fragment shaders for rendering the particles.
  • Popular Now