Jump to content
  • Advertisement
Sign in to follow this  
Blessed

OpenGL [ES 2.0] Texture rendering problem

This topic is 2129 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi everyone,

 

Recently I've been working on a page curl effect in Opengl ES 2.0 for embedded systems. I've been able to write the model and surface deformation algorithm properly, but I have problems with rendering it with a texture. I have attached three screenshots showing exactly the problem I get when rendering the curl at certain angles of the deformation cylinder (yes, the page is deformed around a cylinder). The problem is that if the angle of the cylinder is higher than PI / 2 the texture renders all perfectly, but if it's smaller I get some transparent stripes which you can see through and if you make the angle even smaller the whole bended surface seems to be transparent for the page behind.

 

I have checked if it's not a problem of the mathematical model (the surface crossing itself), but it's not. I have also disabled face culling and alpha blending in this case and I'm out of ideas what can be wrong. I would be very grateful if somebody gave me a hint where to start from.

 

The vertex shader I use is very simple:
 

uniform mat4 uPositionMatrix;
uniform mat4 uMV;

attribute vec4 aPosition;
attribute vec2 aTextureCoord;

varying vec4 vTextureCoord;

void main()
{	
        vTextureCoord = aTextureCoord;
	gl_Position = uPositionMatrix * aPosition;
}

Fragment shader (basic one):

// Fragment shader program
precision highp float;

varying vec2 vTextureCoord;

uniform sampler2D sTexture;

void main (void)
{
	gl_FragColor =  texture2D(sTexture, vTextureCoord);
}

I know I didn't give you a lot of details, but as I don't know where to start from I'll wait for any questions for more details.

 

Thanks in advance!

[attachment=17955:Screen-20130920154606519612.jpg]

[attachment=17956:Screen-20130920154613617023.jpg]

[attachment=17957:Screen-20130920154618177095.jpg]

Share this post


Link to post
Share on other sites
Advertisement

Looks like z-fighting. The curling part of the page (on the cylinder, as you say) looks like it's actually partially intersecting the flat part of the page - make sure your depth buffer is properly setup.

Share this post


Link to post
Share on other sites

Looks like z-fighting. The curling part of the page (on the cylinder, as you say) looks like it's actually partially intersecting the flat part of the page - make sure your depth buffer is properly setup.

 

Thanks for your reply!

 

If I understand it properly z-fighting takes place whenever the z values of the vertices are very close, but in my case the weird thing is that they are very well separated. Please explain me this if I'm wrong.

 

As per the depth test I call:

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);

 

The EGL initialization is as follows:

EGLint numConfigs = 1;
	EGLint eglConfigList[] =
	{ EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 0, EGL_DEPTH_SIZE, 8, EGL_SURFACE_TYPE,
			EGL_WINDOW_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_NONE } ;

	EGLint eglContextList[] =
	{ EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE } ;

	eglBindAPI(EGL_OPENGL_ES_API);
	m_Display = eglGetDisplay((EGLNativeDisplayType)EGL_DEFAULT_DISPLAY);
	if (m_Display == EGL_NO_DISPLAY)
		return -1;

	if (eglInitialize(m_Display, null, null) != EGL_TRUE)
		return -1;

	if (eglChooseConfig(m_Display, eglConfigList, &m_eglConfig, 1, &numConfigs) != EGL_TRUE)
		return -1;

	if ((m_eglSurface = eglCreateWindowSurface(m_Display, m_eglConfig, (EGLNativeWindowType)m_pForm, null)) == EGL_NO_SURFACE)
		return -1;

	if ((m_eglContext = eglCreateContext(m_Display, m_eglConfig, EGL_NO_CONTEXT, eglContextList)) == EGL_NO_CONTEXT)
		return -1;

	if (eglMakeCurrent(m_Display, m_eglSurface, m_eglSurface, m_eglContext) != EGL_TRUE)
		return -1;

	return 0;

Shouldn't this be enough?

Share this post


Link to post
Share on other sites

For posterity, I found the problem. It was in the frustum setup. I have set the near plane to 0.001f and far to 10000.0f which caused some rounding errors probably. Changing the near plane to 10.0f eliminated the  problem.

 

Thanks!

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!