Jump to content
  • Advertisement
Sign in to follow this  
cutovoi

OpenGL 3DS and Transparency

This topic is 4272 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi fellows I'm writing a program that loads 3ds files. I want to add transparent in some 3ds. My code to init the OpenGL is this
void InitializeGL()
{
   glCullFace(GL_BACK);
   glEnable(GL_CULL_FACE);
   glEnable(GL_DEPTH_TEST);
   glShadeModel(GL_SMOOTH);
   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
   glClearColor(0.0, 0.0, 0.0, 0.0);
   glClearDepth(1.0f);
   glDepthFunc(GL_LEQUAL);
   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
   glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
   glLightfv(GL_LIGHT1, GL_AMBIENT, fAmbientLight);
   glLightfv(GL_LIGHT1, GL_DIFFUSE, fDiffuseLight);
   glLightfv(GL_LIGHT1, GL_POSITION, fPositionLight);
   glEnable(GL_LIGHT1);
   glEnable(GL_LIGHTING);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE);
   glColor4f(1.0, 1.0, 1.0, fAlphaFactor); //fAlphaFactor is 0.5
}


My code for draw the 3ds in screen is this:
/*Desenha na tela*/
void Object3DS::DrawObject3DS()
{
   glPushMatrix();
	  glPushAttrib(GL_CURRENT_BIT|GL_ENABLE_BIT);
	     glEnable(GL_BLEND);
	     glDisable(GL_DEPTH_TEST);
		 if(m_bTranslate)
		 {
		    TranslationMatrix(&this->model.Objects[0].TranslationMatrix, fTransX, fTransY, fTransZ);
		    glMultMatrixf(&this->model.Objects[0].TranslationMatrix.theMatrix[0][0]);
			fTransX = fTransY = fTransZ = 0.0f;
		 }
		 if(m_bRotate)
		 {
		    RotationMatrix(&this->model.Objects[0].RotationMatrix, fRotX, fRotY, fRotZ);
            glMultMatrixf(&this->model.Objects[0].RotationMatrix.theMatrix[0][0]);
			fRotX =fRotY = fRotZ = 0.0f;
		 }
         glCallList(m_uiIDDisplayList);
	     glEnable(GL_DEPTH_TEST);
	     glDisable(GL_BLEND);
      glPopAttrib();
   glPopMatrix();

   
}

//Below this is my function that creates a display list
void Object3DS::GenObjectDisplayList()
{
   m_uiIDDisplayList = glGenLists(1);
   glNewList(m_uiIDDisplayList, GL_COMPILE);
      this->model.Draw();  //function that does the calcs to draw the 3ds file
   glEndList();
}


My code works fine. When I add transparency in my 3ds models, some parts receives light. Look at the picture below: Image Hosted by ImageShack.us Like you've seen in my code, the light source is in my InitializeGL, not in the object. I just want that my object stay transparent without light. If I moves the object in the place where are other object the transparency are being VERY strange. It seems the objects have a light. Look at this picture: Image Hosted by ImageShack.us I don't understand this thing too. Someone can explains how can I solve this? [Edited by - LessBread on November 7, 2006 1:17:41 PM]

Share this post


Link to post
Share on other sites
Advertisement
This is the expected behavior.

With blending ("transparency") enabled, a particular fragment's (pixel's) color value is blended via some mathematical equation with the color already existing at that point in the framebuffer. The places where you are observing a "lightening" effect are places where the objects overlap from the point of view of the eye.

The armpits and ears of the human model display this, but the example image where the lungs are placed in front of the torso displays it the best. The torso was rendered first, so its color is in the framebuffer. When the pixels of the lungs are rendered overtop the torso, their reddish color is blended with the skin tones already in the framebuffer, perhaps yielding a net increase in luminance.

You can tweak the appearance of the blending by modifying the parameters to glBlendFunc. In particular, you pass GL_ONE as the destination factor currently; that will cause the the blending equation to use the full magnitude of the destination color, added to the alpha-scaled source color value. This will approach (and eventually exceed) 1.0 in all components very quickly. Try, for example, setting the second parameter to GL_ONE_MINUS_SRC_ALPHA, or any other value (detailed on the page I linked to) to experiment until you find the result you like.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!