Hello.. I am new to OpenGLES and my question is how do I render multiple transparent object?
I am drawing things in 2D using xy-plane. The problem that I am facing is the more object I render, the less opacity it have. Here's my openGLES set up:
// Enable texture mapping.
glEnable(GL_TEXTURE_2D);
// Enable smooth shading.
glShadeModel(GL_SMOOTH);
// Set the depth value used when clearing the depth buffer.
glClearDepthf(1.0f);
// Enable Blend.
glEnable(GL_BLEND);
// Set the type of depth test.
//glDepthFunc(GL_LEQUAL);
// Use the best perspective correction method.
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
Here's my draw call assuming all texture have full opacity:
GLuint tex = GraMgr.RetrieveTexture(R_BOX_TEXTURE);
// Array used for object coordinates.
GLfloat vcoords[4][3];
// Array used for texture coordinates.
GLfloat tcoords[4][2];
// Array used to convert from QUAD to TRIANGLE_STRIP.
// QUAD is not available on the OpenGL implementation
// we are using.
GLubyte indices[4] = {0, 1, 3, 2};
// Set the background color to be used when clearing the screen.
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
// Clear the screen and the depth buffer.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Use the model matrix.
glMatrixMode(GL_MODELVIEW);
// Reset the model matrix.
glLoadIdentity();
// Move into the screen 5 units.
glTranslatef(0.0f, 0.0f, -5.0f);
// Specify rotation along the X, Y, and Z axes.
glRotatef(0, 1.0f, 0.0f, 0.0f);
glRotatef(0, 0.0f, 1.0f, 0.0f);
glRotatef(0, 0.0f, 0.0f, 1.0f);
// Select the texture to use when rendering the box.
glBindTexture(GL_TEXTURE_2D, tex);
glColor4f(0.5f, 0.5f, 1.0f, 2.0f);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
// Set pointers to vertex coordinates and texture coordinates.
glVertexPointer(3, GL_FLOAT, 0, vcoords);
glTexCoordPointer(2, GL_FLOAT, 0, tcoords);
// Enable vertex and texture coord arrays.
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
float scaleX = 2.0f;
float scaleY = 0.5f;
// Define the front face of the box.
tcoords[0][0] = 1.0f; tcoords[0][1] = 0.0f;
vcoords[0][0] = -0.5f * scaleX; vcoords[0][1] = -0.5f; vcoords[0][2] = 1.0f;
tcoords[1][0] = 0.0f; tcoords[1][1] = 0.0f;
vcoords[1][0] = 0.5f * scaleX; vcoords[1][1] = -0.5f; vcoords[1][2] = 1.0f;
tcoords[2][0] = 0.0f; tcoords[2][1] = 1.0f;
vcoords[2][0] = 0.5f * scaleX; vcoords[2][1] = 0.5f; vcoords[2][2] = 1.0f;
tcoords[3][0] = 1.0f; tcoords[3][1] = 1.0f;
vcoords[3][0] = -0.5f * scaleX; vcoords[3][1] = 0.5f; vcoords[3][2] = 1.0f;
// This draws one textured plane using a strip of two triangles.
glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, indices);
// Disable texture and vertex arrays.
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
// Reset the model matrix.
glLoadIdentity();
// Move into the screen 5 units.
glTranslatef(1.0f, 1.0f, -5.0f);
// Specify rotation along the X, Y, and Z axes.
glRotatef(0, 1.0f, 0.0f, 0.0f);
glRotatef(0, 0.0f, 1.0f, 0.0f);
glRotatef(WKMath::PI / 4.0f * 180.0f, 0.0f, 0.0f, 1.0f);
// Select the texture to use when rendering the box.
glBindTexture(GL_TEXTURE_2D, tex);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
// Set pointers to vertex coordinates and texture coordinates.
glVertexPointer(3, GL_FLOAT, 0, vcoords);
glTexCoordPointer(2, GL_FLOAT, 0, tcoords);
// Enable vertex and texture coord arrays.
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
// Define the front face of the box.
tcoords[0][0] = 1.0f; tcoords[0][1] = 0.0f;
vcoords[0][0] = -0.5f; vcoords[0][1] = -0.5f; vcoords[0][2] = 1.0f;
tcoords[1][0] = 0.0f; tcoords[1][1] = 0.0f;
vcoords[1][0] = 0.5f; vcoords[1][1] = -0.5f; vcoords[1][2] = 1.0f;
tcoords[2][0] = 0.0f; tcoords[2][1] = 1.0f;
vcoords[2][0] = 0.5f; vcoords[2][1] = 0.5f; vcoords[2][2] = 1.0f;
tcoords[3][0] = 1.0f; tcoords[3][1] = 1.0f;
vcoords[3][0] = -0.5f; vcoords[3][1] = 0.5f; vcoords[3][2] = 1.0f;
// This draws one textured plane using a strip of two triangles.
glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, indices);
// Disable texture and vertex arrays.
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
// Wait (blocks) until all GL drawing commands to finish.
glFinish();