Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

44
Introduction to OpenGL (Part 3) Ref: OpenGL Programming G uide (The Red Book)

Transcript of Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Page 1: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Introduction to OpenGL(Part 3)

Ref: OpenGL Programming Guide (The Red Book)

Page 2: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 2

Topics

Part 1 Introduction Geometry Viewing Light & Material

Part 2 Display List Alpha Channel Polygon Offset

Part 3 Image Texture Mapping

Part 4 FrameBuffers Selection & Feedback

Page 3: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

OpenGL

Pixels, Bitmaps, and Images

Page 4: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 4

Bitmaps

A bitmap is a rectangular array of 0s and 1s that serves as a drawing mask for a rectangular portion of the windowSpecification:

Specified, in hex codes, in one dimensional array, row by row, starting from lower-left corner

Width need not be multiples of 8

Page 5: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 5

BitmapsglBitmap (w, h, xbo, ybo, xbi, ybi, bitmapPtr) xbo, ybo: origin xbi, ybi: increment CRP after display

glBitmap(10, 12, 0, 0, 11, 0, bitmapPtr)

Fonts: series of

bitmaps as display list

Page 6: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 6

Bitmap (cont)

Note: You can't rotate bitmap fonts because the bitmap is always drawn aligned to the x and y framebuffer axes.Use glColor* to set GL_CURRENT_RASTER_COLOR

Page 7: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 7

Current Raster Position (CRP)

OpenGL maintains raster position, a 3D-position in world coordinateModified by:

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 CRPglGetBooleanv (GL_CURRENT_RASTER_POSITION_VALID, &boolvar) to test validity of CRP

Page 8: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 8

drawf.c

Page 9: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 9

Bitmap Editor

This format is called xwindow bitmap, with xbm extensionBitmaps can be created by the GIMP (GNU Image Manipulation Program)Or, seek format converters

Page 10: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 11

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)

Page 11: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 12

Ex: XBM Edit & Display

Page 12: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 13

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

Page 13: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 14

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

Page 14: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 15

More on glCopyPixels

Note that there's no need for a format or data parameter for glCopyPixels(), since the data is never copied into processor memory. The read source buffer and the destination buffer of glCopyPixels() are specified by glReadBuffer() and glDrawBuffer() respectively Default:

single-buffer: GL_FRONT Double-buffered: GL_BACK

Page 15: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 16

Pixel Format

GREY SCALE

GREY SCALE with alpha

Page 16: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 17

Data Type

Page 17: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 18

Example

255: 0xFF

See also image.c for CopyPixels

Page 18: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 19

Example image.c

Copy the lower left corner to the CRP (where the mouse is)

For single-buffer version, only GL_FRONT is involvedWhile motion is in action, display is not calledDouble-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

Page 19: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 20

PixelZoom (xfactor,yfactor)

Enlarge/shrink imagesUse negative factors for reflected images

Page 20: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 21

Image Loader (TGA)simple TGA utility in gluit.raronly load and save uncompressed images in 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

Page 21: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 22

Image Loader (PNG)Offline; Local copy at webhd2:game-lib

Page 22: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 23

DevIL

Page 23: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 24

int pngLoadRaw (filename,rawinfo)

Must be freed manually

Page 24: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 25

Remark

Most graphics formats have image origin at upper/left cornerWhile OpenGL has the image origin at lower/left cornerHence, if no correction is done, every image is drawn upside down.Correction in PNG loader: pngSetStandardOrientation (1);

Page 25: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 26

Imaging Pipeline

Page 26: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 27

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

Page 27: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 28

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-bitWord:16-bitDouble-word:32-bit

Byte:8-bitWord:16-bitDouble-word:32-bit

Page 28: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 29

Details

Byte aligned (1)

In client memory, the start of each row of pixels is …

w=3,h=2

Assuming the RGB image is of size 3x2:(three bytes per pixel)

1st row 2nd row

Double word aligned (8)

Aligned to even bytes (2); Word aligned (4)

Page 29: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 30

Settings

For RGBA images, it doesn’t matter (each pixel has 4 bytes: RGBARGBA…)

For RGB and luminance images and images with odd width, it should be set to byte-aligned (data are densely packed)

glPixelStorei(GL_UNPACK_ALIGNMENT, 1)

glPixelStorei(GL_UNPACK_ALIGNMENT, 4)

Page 30: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 31

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 lightingIt 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

Page 31: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 32

Example (depthbuffershow)

Get depth buffer content glReadPixels()

Reverse and scale! Near (white) far (black)

Display it as a luminance image glDrawPixels()

Page 32: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 33

Example (rasterpos3)

Illustrate that CRP is a point in R3Image displayed is always parallel to projection planeFake perspective by zooming with distance to camera

Page 33: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 34

Example (sprite)

Process sprite image Add alpha layer

Load png imageSprite animation“feel of depth”

Back-to-front rendering

pixelzoom

Page 34: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Sprites on Google …

Fall 2009 revised 35

(ref)(ref)

Page 35: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

OpenGL

Texture Mapping (Introduction)

Page 36: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 39

Texture Mapping

A way to render realistic picture w/o using too many polygons

Parallax mapping

Page 37: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 40

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

Page 38: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 41

Example

Screen space view

OpenGL code

Texture Map Texture space view

Page 39: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 42

Example

Screen space view

OpenGL code

Texture space viewTexture Map

BACK

Page 40: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

End of Part 3

Page 41: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 44

Results from Xbm Editor

From top to bottomByte swapping

#define sample_width 16#define sample_height 10static char sample_bits[] = {0xff,0x00,0x00,0xff,0x00,0x00,0x07,0xe0,0x00,0x00,0xf0,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

Page 42: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 45

Converting to OpenGL Bitmap

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

Page 43: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 46

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

Page 44: Introduction to OpenGL (Part 3) Ref: OpenGL Programming Guide (The Red Book)

Fall 2009 revised 47

(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 limitedNevertheless, the color is free to change…

BACK