Transcript Part 3

Introduction to OpenGL (Part 3)

Ref: OpenGL Programming Guide (The Red Book)

Topics

Part 1  Introduction    Geometry Viewing Light & Material Fall 2009 revised Part 2    Display List Alpha Channel Polygon Offset Part 3   Image Texture Mapping Part 4  FrameBuffers  Selection & Feedback 2

OpenGL

Pixels, Bitmaps, and Images

Bitmaps

A bitmap is a rectangular array of 0s and 1s that serves as a drawing mask for a rectangular portion of the window Specification:   Specified, in hex codes, in one dimensional array, row by row, starting from lower-left corner Width need not be multiples of 8 Fall 2009 revised 4

Bitmaps

glBitmap (w, h, xbo, ybo, xbi, ybi, bitmapPtr)  xbo, ybo: origin  xbi, ybi: increment CRP after display glBitmap(10, 12, 0, 0, 11, 0, bitmapPtr) Fall 2009 revised Fonts: series of bitmaps as display list 5

Bitmap (cont)

Note: You can't rotate bitmap fonts because the bitmap is always drawn aligned to the framebuffer axes.

x and y

Use glColor* to set GL_CURRENT_RASTER_COLOR Fall 2009 revised 6

Current Raster Position (CRP)

OpenGL maintains world coordinate Modified by: raster position , a 3D-position in   glRasterPos()   specify the object coordinates (as in glVertex); transformed by MODELVIEW & PROJECTION, passed to the clipping stage.

If the position is not culled, raster position is updated; otherwise, it is not valid.

glBitmap() glGetFloatv(GL_CURRENT_RASTER_POSITION, fptr) to obtain the CRP glGetBooleanv (GL_CURRENT_RASTER_POSITION_VALID, &boolvar) to test validity of CRP Fall 2009 revised 7

drawf.c

Fall 2009 revised 8

Bitmap Editor

This format is called xwindow bitmap, with xbm extension Bitmaps can be created by the GIMP (GNU Image Manipulation Program) Or, seek format converters Fall 2009 revised 9

Another XBM Editor ( Here )

A simple Tk Program; require Tcl/Tk installed Get tcltk for Windows from ActiveTcl Note that xbm and the opengl xbitmap format is slightly different (

details

) Fall 2009 revised 11

Ex: XBM Edit & Display

Fall 2009 revised 12

APIs for Images (Pixel Rectangles)

glReadPixels()  Reading pixel data from framebuffer to processor memory.

glDrawPixels()  Writing pixel data from processor memory to framebuffer glCopyPixels()  Copying pixel data within the framebuffer Fall 2009 revised 13

Function Arguments

glReadPixels (x, y, w, h, F, T, ptr)   x,y: window coordinate F: pixel format   T: is data type ptr: pointer to image memory glDrawPixels (w, h, F, T, ptr)  Draw to current raster position glCopyPixels (x, y, w, h, buffer)   Buffer: GL_COLOR | GL_DEPTH | GL_STENCIL Equivalent to: Read then Draw Fall 2009 revised 14

More on glCopyPixels

Note that there's no need for a data memory. respectively format the data is never copied into processor glReadBuffer() and glDrawBuffer() or parameter for glCopyPixels(), since The read source buffer and the destination buffer of glCopyPixels() are specified by  Default:  single-buffer: GL_FRONT  Double-buffered: GL_BACK Fall 2009 revised 15

Pixel Format

GREY SCALE GREY SCALE with alpha Fall 2009 revised 16

Data Type

Fall 2009 revised 17

Example

255: 0xFF See also image.c for CopyPixels Fall 2009 revised 18

Example image.c

Copy the lower left corner to the CRP (where the mouse is) For single-buffer version, only GL_FRONT is involved While motion is in action, display is not called Double-buffer version: [from the API doc] glutSwapBuffers promotes the contents of the back buffer to become the contents of the front buffer. The contents of the back buffer then become undefined. Reality is … two have same content Fall 2009 revised 19

PixelZoom (xfactor,yfactor)

Enlarge/shrink images Use negative factors for reflected images Fall 2009 revised 20

Image Loader (TGA)

simple TGA utility in gluit.rar

only load and save uncompressed greyscale, RGB or RGBA mode.

Info in TGA header:  image type [unsigned char]      1 - colour map image 2 - RGB(A) uncompressed 3 - greyscale uncompressed 9 - greyscale RLE (compressed) 10 - RGB(A) RLE (compressed)  pixel depth [unsigned char]  8 – greyscale | 24 – RGB | 32 - RGBA images in Fall 2009 revised 21

Offline; Local copy at webhd2:game-lib

Image Loader ( PNG )

Fall 2009 revised 22

DevIL

Fall 2009 revised 23

int pngLoadRaw (filename,rawinfo)

Fall 2009 revised Must be freed manually 24

Remark

Most graphics formats have image origin at upper/left corner While OpenGL has the image origin at lower/left corner Hence, if no correction is done, every image is drawn upside down.

Correction in PNG loader: pngSetStandardOrientation (1); Fall 2009 revised 25

Imaging Pipeline

Fall 2009 revised 26

Imaging Pipeline(cont.)

glPixelStore()   Controlling Pixel-Storage Modes glPixelStorei(GL_UNPACK_ALIGNMENT, 1);  Packing and unpacking refer to the way that pixel data is written to and read from processor memory.

 tells OpenGL not to skip bytes at the end of a row Fall 2009 revised 27

PixelStorei(GL_UNPACK_ALIGNMENT, x) Specifies the alignment requirements for the start of each pixel row in memory. The allowable values are:     1 (byte-alignment), 2 (rows aligned to even-numbered bytes), 4 (word-alignment [default] ), and 8 (rows start on double-word boundaries). Byte:8-bit Word:16-bit Double-word:32-bit Fall 2009 revised 28

Details

Assuming the RGB image is of size 3x2: (three bytes per pixel) In client memory, the start of each row of pixels is … w=3,h=2 Byte aligned (1) 1st row 2nd row Aligned to even bytes (2); Word aligned (4) Double word aligned (8) Fall 2009 revised 29

Settings

For RGBA images, it doesn ’ t matter (each pixel has 4 bytes: RGBARGBA … ) For RGB and luminance images and images with odd width packed) , it should be set to byte-aligned (data are densely glPixelStorei(GL_UNPACK_ALIGNMENT, 1) glPixelStorei(GL_UNPACK_ALIGNMENT, 4) Fall 2009 revised 30

Improving Pixel Pipeline Performance

A series of fragment operations is applied to pixels as they are drawn into the framebuffer. For optimum performance, disable all fragment operations (depth test, … ) While performing pixel operations, disable other costly states, such as texturing and lighting It is usually faster to draw a large pixel rectangle than to draw several small ones, since the cost of transferring the pixel data can be amortized ( 分攤 ) over many pixels Fall 2009 revised 31

Example (depthbuffershow)

Get depth buffer content  glReadPixels() Reverse and scale!

 Near (white) far (black) Display it as a luminance image  glDrawPixels() Fall 2009 revised 32

Example (rasterpos3)

Illustrate that CRP is a point in R3 Image displayed is always parallel to projection plane Fake perspective by zooming with distance to camera Fall 2009 revised 33

Example (sprite)

Process sprite image  Add alpha layer Load png image Sprite animation “ feel of depth ”  Back-to-front rendering  pixelzoom Fall 2009 revised 34

Sprites on Google …

( ref ) Fall 2009 revised ( ref ) 35

OpenGL

Texture Mapping (

Introduction )

Texture Mapping

A way to render realistic picture w/o using too many polygons Fall 2009 revised Parallax mapping 39

Texture Coordinate System

Texture: a 2D array of color values, each unit is called texel (texture element) Every texture map has (s,t) coordinates [0,0] to [1,1] Each vertex in a polygon specifies its texture coordinates (s,t), then map to the given image to determine the corresponding texture Fall 2009 revised 40

Example

Texture Map Screen space view Texture space view 41

Example

Screen space view Texture Map Texture space view OpenGL code Fall 2009 revised

End of Part 3

Results from Xbm Editor

From top to bottom Byte swapping #define sample_width 16 #define sample_height 10 static char sample_bits[] = { 0xff,0x00, 0x00,0xff, 0x00,0x00, 0x07,0xe0, 0x00,0x00, 0xf0,0xf8, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00}; Fall 2009 revised 44

Converting to OpenGL Bitmap

Bottom to top & byte swapping #define sample_width 16 #define sample_height 10 static char sample_bits[] = { 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x0f,0x1f, 0x00,0x00, 0xe0,0x07, 0x00,0x00, 0x00,0xff, 0xff,0x00}; 45

Solution

Byte swap: resolved by  glPixelStorei (GL_UNPACK_LSB_FIRST, 1); Bottom to top:  Recall width of bitmap need not be multiples of 8, but it is stored in units of unsigned characters   But, the XBM Editor only allows width of multiples of 8 (8,16,24, … ) See the example code on reading it reversely Fall 2009 revised 46

(almost) Useless API!

There seems to no way to make the bitmap larger (than it should be, pixels)  glPixelZoom won ’ t work!

Therefore, its use is limited Nevertheless, the color is free to change … Fall 2009 revised

BACK

47