Texturing






Texture Environment

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






Texture Environment

GL_MODULATE mode is used when objects are both textured and lighted

Example: texlight.py






Filtering

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).

    





Filtering

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

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.






Mipmapping

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






Alpha



alpha
1.0fully opaque
0.5half transparent
0.0fully transparent





Blending

Most common method:

R = A1 * R1 + (1-A1) * R2
G = A1 * G1 + (1-A1) * G2
B = A1 * B1 + (1-A1) * B2


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





Blending

Many different formulas for blending colors can be used

Formula is defined by glBlendFunc() function


R = A1 * R1 + (1-A1) * R2
G = A1 * G1 + (1-A1) * G2
B = A1 * B1 + (1-A1) * B2

is defined by:

  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)





Blending

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






Smooth-shaded Alpha

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






Time-varying Alpha

Changing alpha over time can make an object a fade in or out

Example: fade.py






Blending & Drawing Order

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

+ =





Blending & Drawing Order

Depth-buffering occurs before blending

To draw a transparent plus an opaque object, draw the opaque one first

Draw sphere, then cubeDraw cube, then sphere

Example: drawOrder0.py






Blending & Drawing Order

Multiple transparent objects need to be drawn in back-to-front order

The order can depend on the camera position

Example: drawOrder1.py






Depth Mask

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






Backface Culling

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






Backface Culling

"Front-facingness" is determined by vertex order

When viewed from the front, vertices are in counter-clockwise order

Front facing Back facing
      





Multipass Rendering

Rendering the same objects more than once, with different modes


Render once with glCullFace(GL_FRONT), once with glCullFace(GL_BACK)






Other Blend Functions

General blending formula is:

R = SourceFactor * Rs + DestinationFactor * Rd
G = SourceFactor * Gs + DestinationFactor * Gd
B = SourceFactor * Bs + DestinationFactor * Bd

(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()






Other Blend Functions

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)





Filters

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






Filters

 # 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)


Creative Commons License
This document is by Dave Pape, and is released under a Creative Commons License.