🔒 Locked
transparent
Advertisement
Original Post
i'm having some trouble again with my transparency... my sprites are being rendered with depth test and depth mask on and blending turned on with glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); as the blending function. BUT, in places where my texture has alpha of 0, it doesn't show the sprite behind it, it shows black, as if the color is black with alpha of 255. what's wrong?
the objects don't need to be drawn in order, that's what the depth test is. and when i say transparent, i mean part of my sprite is transparent (alpha 0) and a lot is opaque (alpha 255), the part that's 0 is not showing the sprite behind it, it's showing up black
sounds like you need alpha testing, not blending:
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0);
note that with blending enabled, you might have blurry edges where the draw order *does* matter, even with alpha values of only 0 and 255. i think openGL does this to make it look smoother.
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0);
note that with blending enabled, you might have blurry edges where the draw order *does* matter, even with alpha values of only 0 and 255. i think openGL does this to make it look smoother.
well that fixed it, is there a way to disable the "smooth" thing? because it's like I see a fine line of black pixels at the edge of my texture that has the alpha test
if i can't do that, how ELSE am i supposed to get sprites to look correctly?? i need blending, i obviously need alpha testing, and i need depth testing and mask.
i'll try moving it a texel in towards the center
Quote:That "smooth thing" is called (bi)linear texture filtering. You disable it by using GL_NEAREST for the minification and magnification filtering modes instead of GL_LINEAR. The reason you get a black color at the edge of your texture is because the transparent pixels in the image are black, so when the texture is filtered you get some mix of (0,0,0,0) and your opaque color.
Original post by EvilKnuckles666
well that fixed it, is there a way to disable the "smooth" thing? because it's like I see a fine line of black pixels at the edge of my texture that has the alpha test
One way to "fix" this while still being able to use linear filtering is to simply use a different color for the transparent pixels that more closely match the pixels at the border of opaque->transparent. This will still have some artifacts where the colors don't match perfectly but it is much less noticeable and may be adequate for your purposes. The correct way is to extrude the colors at that border into the transparent pixels.
sweet, everything looks great now thanks :) is that a lot slower though because i can't really tell but it just kinda looks and feels little.. jittery
Quote:Which method are you using? Using nearest filtering should be slightly faster than linear filtering, although it will most likely be unnoticeable. The other two methods will have no run-time cost at all, they should be done at load-time or even before... it's possible to do it at content-creation-time (ie: have the artists make the images with the proper background or colors extruded already, then you won't need to do anything different at load-time).
Original post by EvilKnuckles666
sweet, everything looks great now thanks :) is that a lot slower though because i can't really tell but it just kinda looks and feels little.. jittery
You can also try different values for glAlphaFunc, using a higher value reduces the blurry border.
the Alpha channel has nothing to do with the RGB channels, if you are (for example) attempting drawing vegetation, bush. The textures should look like all green, with bush detail in the middle.
The alpha channel will do the visibility job.
You DONT have to put a unique RGB color for the transparent color (like purple, green or black).
With opengl, Use RGBA texture (Anyway in the VRAM they will be RGBA)
The alpha channel will do the visibility job.
You DONT have to put a unique RGB color for the transparent color (like purple, green or black).
With opengl, Use RGBA texture (Anyway in the VRAM they will be RGBA)
I just wanted to clarify that in my posts I did not mean to imply using a color key when I talked about the color of transparent pixels. What I meant was simply the RGB components of RGBA pixels where alpha=0. My second suggestion, if done at load-time, could be thought of as the reverse of color-keying. The pixels are already transparent and you're just setting the RGB values to a certain color to minimize the linear interpolation artifacts.
Topic Locked
This topic has been locked by a moderator. New replies are not allowed.
Sign in to reply to this topic.
Advertisement