Question on Rendering Multiple Transparent object

Started by
1 comment, last by W.k Seah 11 years, 3 months ago

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();

Advertisement

The usual way of transparency is with GL_SRC_ALPHA for the source, and GL_ONE_MINUS_SRC_ALPHA for the destination. It means that the alpha channel of the source is solely responsible for how blending will be done: A value of 1 stamps in the source color while a value of 0 will suppress the source color totally; values in-between will mix the source and destination, of course. However, your set-up of glBlendFunc lets the destination color ever come through, because you've chosen the destination factor to be 1.

You perhaps want to play with a tool like this to check-out how blending works.

BTW: You should not use a value outside [0,1] for the alpha (or any other) channel in glColor4f.

Yea.. Just trying something out and see if things turn out more opac but it didn't

This topic is closed to new replies.

Advertisement