Textures provide color information, but so does glColor or lighting.
The texture environment controls how these colors interact.
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, mode)
A "GL_REPLACE" environment uses just the texture color, and ignores everything
else.
Color = Ct
A "GL_MODULATE" environment combines the texture and other color, multiplying
them together.
Color = Ct * Cf
Example: texenv.py
GL_MODULATE mode is used when objects are both textured and lighted
Example: texlight.py
Applying a texture involves sampling - for each pixel drawn on the screen, OpenGL must compute a color from the texture image.
Texels (texture pixels) rarely match up exactly 1-to-1 with the pixels on the screen .
Filtering modes select what to do when texels are larger than screen pixels (magnification), or when texels are smaller than screen pixels (minification).
glTexParameteri(GL_TEXTURE_2D, filter, mode)
If filter is GL_TEX_MAG_FILTER, mode can be
If filter is GL_TEX_MIN_FILTER, mode can be
Example: texfilter.py
Mipmapping uses versions of the texture at smaller & smaller sizes image, to effectively pre-compute the average of many texels.
As a texture gets more and more minified, many texels will correspond to a single screen pixel, and using a "nearest" or "linear" filter will not compute an accurate result. The texture will appear to flicker as the object moves.
A mipmapped texture avoids the flickering problem when minified. As a result, it can look a bit fuzzier.
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB,
width, height, GL_RGB,
GL_UNSIGNED_BYTE, pixels)
Use gluBuild2DMipmaps in place of glTexImage2D.
It will automatically generate all the smaller versions of the texture.
Example: mipmap.py
| alpha | |
|---|---|
| 1.0 | fully opaque |
| 0.5 | half transparent |
| 0.0 | fully transparent |
Most common method:
| e.g. if alpha is 0.25: |
R = 0.25 * R1 + 0.75 * R2
G = 0.25 * G1 + 0.75 * G2 B = 0.25 * B1 + 0.75 * B2 |
Many different formulas for blending colors can be used
Formula is defined by glBlendFunc() function
is defined by:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
| Enable blending | glEnable(GL_BLEND) | |
| Set the blending function | glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) | |
| Assign alpha < 1 | glColor4f(1, 0, 0, 0.5) |
BlendFunc is applied to pixels as they are drawn - blending incoming color with color in the frame buffer
Example: alpha.py
Alpha is treated like any other color component
If alpha differs at each vertex,
it will be smoothly interpolated.
Can give objects soft edges.
Examples: smoothAlpha.py alphawheel.py
Changing alpha over time can make an object a fade in or out
Example: fade.py
Objects are rendered one at a time
When blending, all that is known is the current polygon, and the results of previous rendering (frame buffer contents)
These are the source & destination colors of the blending formula
| + |
| = |
|
Depth-buffering occurs before blending
To draw a transparent plus an opaque object, draw the opaque one first
| Draw sphere, then cube | Draw cube, then sphere |
|---|---|
![]() | ![]() |
Example: drawOrder0.py
Multiple transparent objects need to be drawn in back-to-front order
![]() |
![]() |
![]() |
The order can depend on the camera position
Example: drawOrder1.py
Can prevent transparent objects occluding each other by disabling the depth mask:
glDepthMask(GL_FALSE)
Result can be incorrect, but errors are less noticeable
|
|
|
Example: depthmask.py
Back faces are normally visible in transparent objects
glEnable(GL_CULL_FACE) prevents drawing back faces of objects
| glDisable(GL_CULL_FACE) | glEnable(GL_CULL_FACE) | |
|---|---|---|
|
|
Example: cullface.py
"Front-facingness" is determined by vertex order
When viewed from the front, vertices are in counter-clockwise order
| Front facing | Back facing | |
|---|---|---|
|
|
Rendering the same objects more than once, with different modes
Render once with glCullFace(GL_FRONT), once with glCullFace(GL_BACK)
General blending formula is:
(Rs, Gs, Bs) is the
source color (object being drawn)
(Rd, Gd, Bd) is the
destination color (color already in the framebuffer)
SourceFactor and DestinationFactor are defined by glBlendFunc()
| Factor name | Computed factor |
|---|---|
| GL_ZERO | 0 |
| GL_ONE | 1 |
| GL_SRC_ALPHA | As |
| GL_ONE_MINUS_SRC_ALPHA | 1 - As |
| GL_DST_ALPHA | Ad |
| GL_ONE_MINUS_DST_ALPHA | 1 - Ad |
| GL_CONSTANT_ALPHA | Ac |
| GL_ONE_MINUS_CONSTANT_ALPHA | 1 - Ac |
| GL_SRC_COLOR | (Rs, Gs, Bs) |
| GL_ONE_MINUS_SRC_COLOR | (1 - Rs, 1 - Gs, 1 - Bs) |
| GL_DST_COLOR | (Rd, Gd, Bd) |
| GL_ONE_MINUS_DST_COLOR | (1 - Rd, 1 - Gd, 1 - Bd) |
| GL_CONSTANT_COLOR | (Rc, Gc, Bc) |
| GL_ONE_MINUS_CONSTANT_COLOR | (1 - Rc, 1 - Gc, 1 - Bc) |
| GL_SRC_ALPHA_SATURATE | min(As, 1 - Ad) |
Blending can be used to apply a color filter to the whole scene
Draw a square that covers the entire window, with the appropriate blending function
# Dim the scene glBlendFunc(GL_ZERO, GL_SRC_ALPHA) glColor4f(1.0, 1.0, 1.0, 0.5) |
|
Example: filter.py
# Apply a purple filter glBlendFunc(GL_ZERO, GL_SRC_COLOR) glColor4f(1.0, 0.0, 0.5, 1.0) |
|
# Invert all the colors glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO) glColor4f(1.0, 1.0, 1.0, 1.0) |
|
