Strange depth/blending in OpenGL drawing models -
i'm having strange problem cannot figure out life of me. i'm loading obj model file maya , rendering opengl environment. appears go , in independent model viewer, display correctly. however, when loaded game environment (with strange projection matrix have no control over), model not display correctly.
the vertices seem in correct place in rotating model gives correct sense of 3d. however, depending on depth function, different parts of model appear (incorrectly).
for example, in model of person, when person walking left right (e.g. right side of model visible camera); if depth function set gl_lequal
, unable see right arm of person when in front of torso. however, when mode set gl_less
, able see left arm through torso. 1 of things easier see pictures here go:
gl_less
or gl_notequal
:
gl_lequal
or gl_always
:
it should noted nothing displayed other depth function. in first picture of gl_lequal series, can see left arm partially obscured torso when shouldn't be.
here code used render model:
gl.gldisable(gl.gl_blend); gl.glmatrixmode(gl.gl_modelview); gl.glpushmatrix(); gl.glloadidentity(); layertextureshader.updateshader(gl, projection, disparitytop, disparitybottom, fieldmask, 1); // gl.gldepthfunc(gl.gl_never); // 512 // gl.gldepthfunc(gl.gl_less); // 513 // gl.gldepthfunc(gl.gl_equal); // 514 // gl.gldepthfunc(gl.gl_lequal); // 515 // gl.gldepthfunc(gl.gl_greater); // 516 // gl.gldepthfunc(gl.gl_notequal); // 517 // gl.gldepthfunc(gl.gl_gequal); // 518 // gl.gldepthfunc(gl.gl_always); // 519 gl.gldepthfunc(currentglcomparison); gl.glenable(gl.gl_depth_test); gl.glclear(gl.gl_depth_buffer_bit); gl.gldepthmask(true); gl.gldepthrange(0, 0.01); gl.glbindbuffer(gl.gl_array_buffer, getvertexbufferobject()); gl.glbufferdata(gl.gl_array_buffer, getnoofvertices() * 3 * 4, getvertices(), gl.gl_stream_draw); gl.glbindbuffer(gl.gl_array_buffer, 0); gl.glbindbuffer(gl.gl_array_buffer, gettexcoordbufferobject()); gl.glbufferdata(gl.gl_array_buffer, getnoofvertices() * 2 * 4, gettexcoords(), gl.gl_stream_draw); gl.glbindbuffer(gl.gl_array_buffer, 0); gl.glbindbuffer(gl.gl_element_array_buffer, getindicesbufferobject()); gl.glbufferdata(gl.gl_element_array_buffer, getnoofindices() * 4, getindices(), gl.gl_stream_draw); gl.glbindbuffer(gl.gl_element_array_buffer, 0); gl.glbindbuffer(gl.gl_array_buffer, getcolorbufferobject()); gl.glbufferdata(gl.gl_array_buffer, getnoofvertices() * 4 * 4, getcolors(), gl.gl_stream_draw); gl.glbindbuffer(gl.gl_array_buffer, 0); gl.glenable(gl.gl_texture_2d); gl.glactivetexture(gl.gl_texture0); layertextureshader.use(gl); gl.glenableclientstate(gl.gl_vertex_array); gl.glbindbuffer(gl.gl_array_buffer, getvertexbufferobject()); gl.glvertexpointer(3, gl.gl_float, 0, 0); gl.glenableclientstate(gl.gl_color_array); gl.glbindbuffer(gl.gl_array_buffer, mask ? getmaskcolorbufferobject() : getcolorbufferobject()); gl.glcolorpointer(4, gl.gl_float, 0, 0); gl.glclientactivetexture(gl.gl_texture0); gl.glenableclientstate(gl.gl_texture_coord_array); gl.glbindbuffer(gl.gl_array_buffer, gettexcoordbufferobject()); gl.gltexcoordpointer(2, gl.gl_float, 0, 0); gl.glbindbuffer(gl.gl_element_array_buffer, getindicesbufferobject()); final int count = getnoofindices(); gl.gldrawelements(gl.gl_triangles, count, gl.gl_unsigned_int, 0); gl.glbindbuffer(gl.gl_element_array_buffer, 0); gl.glbindbuffer(gl.gl_array_buffer, 0); gl.gldisableclientstate(gl.gl_vertex_array); gl.gldisableclientstate(gl.gl_color_array); gl.gldisableclientstate(gl.gl_texture_coord_array); layertextureshader.release(gl); gl.gldisable(gl.gl_texture_2d); gl.gldisable(gl.gl_depth_test); gl.glenable(gl.gl_blend); gl.glpopmatrix();
thanks help, has had me stumped quite few days now.
looks projection matrix set this:
gluperspective ( 90, (glint)width/ (glint)height, 0.0, 200.0 );
see mistake ? - 0.0 value not acceptable. positive values use 0.01 instead of 0.0 third argument.
Comments
Post a Comment