Jump to content

  • Log In with Google      Sign In   
  • Create Account


[ES 2.0] Texture rendering problem


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 Blessed   Members   -  Reputation: 131

Like
0Likes
Like

Posted 20 September 2013 - 08:51 AM

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!

Screen-20130920154606519612.jpg

Screen-20130920154613617023.jpg

Screen-20130920154618177095.jpg



Sponsor:

#2 radioteeth   Prime Members   -  Reputation: 905

Like
2Likes
Like

Posted 20 September 2013 - 10:52 AM

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.



#3 Blessed   Members   -  Reputation: 131

Like
0Likes
Like

Posted 23 September 2013 - 02:17 AM

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?



#4 Blessed   Members   -  Reputation: 131

Like
0Likes
Like

Posted 23 September 2013 - 07:54 AM

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!






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS