views:

25

answers:

1

Hello, I'm a beginner to 3D graphics in general and I'm trying to make a 3D game for the iPhone, and more specifically, to use textures that contain transparency. I am able to load a texture (an 8 bit .png file) into OpenGL and map it to a square (made from a triangle strip) but the transparent parts of the image are not transparent when I run the app in the simulator - they take on the background colour, whatever it is set to, but obscure images that are further away. I am unable to post a screenshot as I am a new user, so my apologies for that. I will try to upload and link it some other way.

Even more annoying is that when I load the image into Apple's GLSprite example code, it works exactly as I want it to. I have copied the code from GLSprite's setupView into my project and it still doesn't work properly.

I am using the blend function:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

I was under the impression that this is correct for what I want to do.

Is there something very basic I am missing here? Any help would be much appreciated as I am submitting this as a coursework project in a few weeks and would very much like it to work.

A: 

Let me break this down:

First of all your transparent object is drawn.

At this point two things happen:

  • The pixels are drawn correctly to the back buffer
  • The depth buffer pixels are set in the depth buffer. Note that the depth buffer will write values all across your object, and transparency does not affect it.

You then draw other objects behind the transparent object. But any of these objects pixels will not be drawn, because their depth buffer value are less than those already drawn.

The solution to this problem is to draw your scene back-to-front (draw starting at the further away things).

Hope that helps.

Edit: I'm assuming you are using the depth buffer here. If this isn't correct I'll consider writing another answer.

CiscoIPPhone
Thankyou, this works a treat! Having simply dived in at the deep end with 3D graphics, I think missed out on some of the simple stuff like this.
Jay
Glad I could help. I think diving in is often the best way to learn :)
CiscoIPPhone