• Announcements

    • khawk

      Download the Game Design and Indie Game Marketing Freebook   07/19/17

      GameDev.net and CRC Press have teamed up to bring a free ebook of content curated from top titles published by CRC Press. The freebook, Practices of Game Design & Indie Game Marketing, includes chapters from The Art of Game Design: A Book of Lenses, A Practical Guide to Indie Game Marketing, and An Architectural Approach to Level Design. The GameDev.net FreeBook is relevant to game designers, developers, and those interested in learning more about the challenges in game development. We know game development can be a tough discipline and business, so we picked several chapters from CRC Press titles that we thought would be of interest to you, the GameDev.net audience, in your journey to design, develop, and market your next game. The free ebook is available through CRC Press by clicking here. The Curated Books The Art of Game Design: A Book of Lenses, Second Edition, by Jesse Schell Presents 100+ sets of questions, or different lenses, for viewing a game’s design, encompassing diverse fields such as psychology, architecture, music, film, software engineering, theme park design, mathematics, anthropology, and more. Written by one of the world's top game designers, this book describes the deepest and most fundamental principles of game design, demonstrating how tactics used in board, card, and athletic games also work in video games. It provides practical instruction on creating world-class games that will be played again and again. View it here. A Practical Guide to Indie Game Marketing, by Joel Dreskin Marketing is an essential but too frequently overlooked or minimized component of the release plan for indie games. A Practical Guide to Indie Game Marketing provides you with the tools needed to build visibility and sell your indie games. With special focus on those developers with small budgets and limited staff and resources, this book is packed with tangible recommendations and techniques that you can put to use immediately. As a seasoned professional of the indie game arena, author Joel Dreskin gives you insight into practical, real-world experiences of marketing numerous successful games and also provides stories of the failures. View it here. An Architectural Approach to Level Design This is one of the first books to integrate architectural and spatial design theory with the field of level design. The book presents architectural techniques and theories for level designers to use in their own work. It connects architecture and level design in different ways that address the practical elements of how designers construct space and the experiential elements of how and why humans interact with this space. Throughout the text, readers learn skills for spatial layout, evoking emotion through gamespaces, and creating better levels through architectural theory. View it here. Learn more and download the ebook by clicking here. Did you know? GameDev.net and CRC Press also recently teamed up to bring GDNet+ Members up to a 20% discount on all CRC Press books. Learn more about this and other benefits here.
Sign in to follow this  
Followers 0
jgg

Color transparency misunderstanding

8 posts in this topic

Hi there,

I'm new to OpenGL and I'm reading the NeHe's OpenGL tutorials which seem pretty easy to follow and very instructive. I have just read [url="http://nehe.gamedev.net/tutorial/moving_bitmaps_in_3d_space/17001/"]lesson 9[/url], "Moving bitmaps in 3D space", and there is one thing I don't understand.

The program draws some stars which are defined with a specific color. Additionally, you can make them twinkle by pressing the 'T' key. Then, the colors of two different stars are mixed. What I don't understand is how these two colors can be mixed as they are defined for the star texture. I mean, when applied the colors for the two stars to be drawn, the two of them are defined with an alpha value of 255 (1.0f) (check the code below), which means the color should be opaque. So, if they are meant to be opaque, how can they be mixed? Should not the last star to be drawn overlapping the previous one?

Any help would be really appreciated.

Thank you.

[code]...

if (twinkle)
{
glColor4ub(star[(num-loop)-1].r,star[(num-loop)-1].g,star[(num-loop)-1].b,255);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd();
}

glRotatef(spin,0.0f,0.0f,1.0f);
glColor4ub(star[loop].r,star[loop].g,star[loop].b,255);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,-1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd();
...[/code]
0

Share this post


Link to post
Share on other sites
if you look in the function InitGL you will see these two lines

glBlendFunc(GL_SRC_ALPHA,GL_ONE); // Set The Blending Function For Translucency
glEnable(GL_BLEND);

This means that instead of replacing the color when overdrawing it will instead add to the color depending on the color and alpha of the texture your drawing.
Try commenting them out and see what happens.
0

Share this post


Link to post
Share on other sites
I understand that these lines enable blending so translucency effect happens, but it seems that the alpha value just changes the brightness of the color.

For example, in [url="http://nehe.gamedev.net/tutorial/blending/16001/"]lesson 8[/url], the blending enable code is like this:

[code]
glColor4f(1.0f, 1.0f, 1.0f, 0.5f); // Full Brightness. 50% Alpha
glBlendFunc(GL_SRC_ALPHA,GL_ONE); // Set The Blending Function For Translucency[/code]

If I set the alpha variable in glColor4f to 0.0f the cube becomes invisible, what makes sense as it should be completely transparent. However, when setting alpha to 1.0f, instead of having an opaque cube, it seems to be again 50% transparent but with lighter colors. I know that if I want to get opaque textures I just have to turn off blending (as it is shown in the same code of lesson 8), but what if I want to get a 33% or 85% transparency for example? Setting 0.33f or 0.85f in the 4th argument just makes the transparent cube lighter or darker, no effect on translucency at all.

Probably I'm missing something but, as I said before, I'm a complete newbie and I would like to learn with this; that's why I'm asking [img]http://public.gamedev.net/public/style_emoticons/default/smile.gif[/img].

Thank you so much for your help.
0

Share this post


Link to post
Share on other sites
[quote name='jgg' timestamp='1315330066' post='4858251']
I understand that these lines enable blending so translucency effect happens, but it seems that the alpha value just changes the brightness of the color.

For example, in [url="http://nehe.gamedev.net/tutorial/blending/16001/"]lesson 8[/url], the blending enable code is like this:

[code]
glColor4f(1.0f, 1.0f, 1.0f, 0.5f); // Full Brightness. 50% Alpha
glBlendFunc(GL_SRC_ALPHA,GL_ONE); // Set The Blending Function For Translucency[/code]

If I set the alpha variable in glColor4f to 0.0f the cube becomes invisible, what makes sense as it should be completely transparent. However, when setting alpha to 1.0f, instead of having an opaque cube, it seems to be again 50% transparent but with lighter colors. I know that if I want to get opaque textures I just have to turn off blending (as it is shown in the same code of lesson 8), but what if I want to get a 33% or 85% transparency for example? Setting 0.33f or 0.85f in the 4th argument just makes the transparent cube lighter or darker, no effect on translucency at all.

Probably I'm missing something but, as I said before, I'm a complete newbie and I would like to learn with this; that's why I'm asking [img]http://public.gamedev.net/public/style_emoticons/default/smile.gif[/img].

Thank you so much for your help.
[/quote]
The parameters to glBlendFunc controls how much of the source color (what you draw) is blended with the destination color (what is already in the frame buffer). The first factor, GL_SRC_ALPHA, means the source color is multiplied by the source alpha value. The second parameter, GL_ONE, means the destination color is multiplied by the constant factor 1. These two colors are then added to produce the final color that is written back to the frame buffer.

So if alpha is zero, the final color is srcColor*0+dstColor*1, which is the same as dstColor. The object thus appear invisible, since the result of the blending stage is whatever was in the frame buffer before blending in the second object.
If alpha is one, the final color is srcColor*1+dstColor*1, which is brighter and an equal blend of the source and destination color. The object appears brighter since the total additive factor is 2, and half transparent since the final color is a blend of 1 part source and 1 part destination color. Or, in other words, a 50/50 blending.

What you probably want is to decrease the contribution from the destination color as the alpha increases. Luckily, there is a constant GL_ONE_MINUS_SRC_ALPHA, and I'll let you figure out what it means, where to use it, and how it affects the final blended color.
1

Share this post


Link to post
Share on other sites
Thanks for your detailed explanaiton, Brother Bob. Setting this, for example:

[code]
glColor4f(1.0f, 1.0f, 1.0f, 0.85f);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
[/code]
nearly produces the transparency effect I was expecting; I just miss one thing. As the cube is rotating, its sides change their position into the 3D space so, as they are repainted, some weird transparency behavior happens, like the back side being painted "over" the front side. It happens due to the order (always the same) in which the cube sides are painted in the DrawGLScene function, as the front side is the first in code, so every other side coming after will be painted over it. Am I wrong? In order to keep a "logic" transparency process while the cube is rotating, is there any other procedure different than calculating how sides should be repainted according to cube's position?

Thank you again.
0

Share this post


Link to post
Share on other sites
That particular blending function is order dependent, which means that the result depends on in which order you draw them. You have to draw from back to front. That means that, depending on how your cube is oriented, you have to draw its faces in different orders to ensure that the back of the cube, as seen from the viewpoint, is drawn before the front of the cube.
0

Share this post


Link to post
Share on other sites
Right. And, just to know, is there a different blending function that automatically takes care of this?
0

Share this post


Link to post
Share on other sites
There are other blending functions that aren't order dependent, but they do not give you the kind of translucency you're asking for.
0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0