[ES 2.0] Texture rendering problem

Started by
2 comments, last by Blessed 10 years, 6 months ago

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]

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.

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?

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!

This topic is closed to new replies.

Advertisement