Jump to content

  • Log In with Google      Sign In   
  • Create Account


Question on Rendering Multiple Transparent object


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
2 replies to this topic

#1 N00bKefka   Members   -  Reputation: 120

Like
0Likes
Like

Posted 27 December 2012 - 12:01 PM

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

 



Sponsor:

#2 haegarr   Crossbones+   -  Reputation: 3749

Like
0Likes
Like

Posted 27 December 2012 - 01:03 PM

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.



#3 N00bKefka   Members   -  Reputation: 120

Like
0Likes
Like

Posted 27 December 2012 - 07:27 PM

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






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