H331 computer graphics
This presentation is the property of its rightful owner.
Sponsored Links
1 / 59

H331: Computer Graphics PowerPoint PPT Presentation


  • 74 Views
  • Uploaded on
  • Presentation posted in: General

H331: Computer Graphics. Philip Dutré Department of Computer Science Wednesday, February 25. Today. Graphics programming Book: Chapters 3, 4, 10. Announcements. Practicum 1 available http://www.cs.kuleuven.ac.be/~graphics/H331/ Practicum 1 & 2: 7 points / 20 Best: 4 2 nd best: 3.

Download Presentation

H331: Computer Graphics

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


H331 computer graphics

H331: Computer Graphics

Philip Dutré

Department of Computer Science

Wednesday, February 25


Today

Today

  • Graphics programming

  • Book: Chapters 3, 4, 10


Announcements

Announcements

  • Practicum 1 available

    • http://www.cs.kuleuven.ac.be/~graphics/H331/

  • Practicum 1 & 2: 7 points / 20

    • Best: 4

    • 2nd best: 3


Announcements1

Announcements

  • SIGGRAPH Los Angeles August 8-12

  • http://www.siggraph.org/s2004/

  • Student volunteers! (Deadline: February 25)


3d 2d

3D  2D

  • How to transform the 3D world to a 2D image?

  • 3 aspects:

    • Objects: exist in space, independent of viewer

    • Viewer: camera, human, ….

    • Lights: shading, shadows, …


3d 2d1

3D  2D

Objects (points, lines, polygons)

Described by vertices

Lights (e-m spectrum)

(350-780 nm)

Viewer = camera


Pinhole camera

Pinhole camera


Synthetic camera

Synthetic Camera

Projection plane in front of center-of-projection:


Synthetic camera1

Synthetic Camera

Clipping: looking through a window


3d apis

3D APIs

  • Synthetic camera is basis of 3D API

    • OpenGL, PHIGS, Direct 3D, VRML,JAVA-3D, GKS, …

  • We need to functions to specify:

    • Objects: vertices that describe points, lines, polygons

    • Camera: position, orientation, width, height

    • Light sources: position, color

    • Materials: reflection characteristics


3d apis1

3D APIs

glBegin(GL_POLYGON)

glVertex3f(0.0, 0.0, 0.0);

glVertex3f(0.0, 1.0, 0.0);

glVertex3f(0.0, 0.0, 0.1);

glEnd();

gluLookAt(posx, posy, posz, atx, aty, atz, …);

glPerspective(view_angle, …);


3d apis2

3D APIs

  • 3D API performs modeling + rendering

  • But … modeling can also be done ‘off-line’

    • Write model to file

    • Read file in 3D API and transform to 3D API modeling commands

  • RenderMan (Pixar)

    • Prepares off-line model for rendering

    • Rendering takes ‘converted’ model


Graphics hardware

Graphics hardware

  • 3D ‘world’ coordinates  2D ‘screen’ coordinates


Graphics hardware1

Graphics hardware

  • 3D vertex  2D pixel

Transform to camera coordinate system

Clip away things we don’t see in the camera window

3D coordinates  2D coordinates

Transform to pixels in the frame buffer


How to draw things

How to draw things?

  • Given: window on the screen

  • Graphics API (e.g. OpenGL) has something of the form:

    plotPixel(int x, int y)


How to draw things1

window

How to draw things?

  • plotPixel(289,190)

  • plotPixel(320,128)

  • plotPixel(239,67)

  • plotPixel(194,101)

  • plotPixel(129,83)

  • plotPixel(75,73)

  • plotPixel(74,74)

  • plotPixel(20,10)


How to draw things2

Y

window

y

X

x

How to draw things?

plotPixel(x,y)

screen


Why is this impractical

Why is this impractical?

  • Coordinates are expressed in screen space, but objects live in (3D) world space

  • Resizing window implies we have to change coordinates of objects to be drawn

  • We want to make a separation between:

    • values to describe geometrical objects

    • values needed to draw these objects on the screen


How to draw things3

How to draw things?

  • Specify points to OpenGL

glVertex*( … )

glVertex2i( … )glVertex3i( … )

glVertex2f( … )glVErtex3f( … )

glBegin(GL_LINES);

glVertex2f(x1, y1);

glVertex2f(x2, y2);

glEnd();

glBegin(GL_POINTS);

glVertex2f(x1, y1);

glVertex2f(x2, y2);

glEnd();


How to draw things4

How to draw things?

For (k=0; k<500; k++) {

// compute point k

x = …;

y = …;

glBegin(GL_POINTS);

glVertex2f(x, y);

glEnd();

}

glFlush();


More about opengl

More about OpenGL…

  • OpenGl = set of libraries


More about opengl1

More about OpenGL…

  • OpenGl supports geometric primitives and raster primitives


Geometric primitives in opengl

Geometric Primitives in OpenGL

  • Geometric primitives are defined by vertices

    • GL_POINTS

    • GL_LINES

    • GL_LINE_STRIP, GL_LINE_LOOP


Geometric primitives in opengl1

Geometric Primitives in OpenGL

  • Closed loops = polygons

  • Polygons: describe surfaces


Geometric primitives in opengl2

Geometric Primitives in OpenGL

  • GL_POLYGON, GL_QUADS, …


Viewing in opengl

Viewing in OpenGL

  • Scene is independent of camera

  • gluOrtho2D(left, tight, bottom, top)


3d primitives

3D primitives

void triangle(point3 a, point3 b, point3 c) {

glBegin(GL_POLYGON)

glVertex3fv(a);

glVertex3fv(b);

glVertex3fv(c);

glEnd();

}

void tetrahedron () {

glColor3f(1.0,0.0,0.0);

triangle(v[0], v[1], v[2]);

}


3d primitives1

3D primitives

  • Hidden surfaces?

  • Z-buffer

    • Keep depth for each pixel

  • Initialize!

    • glClear(GL_COLOR_BUFFER_BIT);

    • glClear(GL_DEPTH_BUFFER_BIT);

    • glFlush();


World window viewport

World window & viewport

  • World window:specifies what part of the world should be drawn

  • Viewport:rectangular area in the screen window in which we will draw


World window viewport1

window

World window & viewport

screen window

world window

viewport


Mapping world window to viewport

window

Mapping: world window to viewport

Vt

Wt

Wb

Vb

Vl

Vr

Wl

Wr


Mapping world window to viewport1

window

Mapping: world window to viewport

Maintain proportions!

Vt

Wt

Wb

Vb

Vl

Vr

Wl

Wr


Mapping world window to viewport2

Mapping: world window to viewport

x

sx

Vl

Vr

Wl

Wr


Mapping world window to viewport3

Mapping: world window to viewport

  • If x = Wl, then sx = Vl

  • If x = Wr, then sx = Vr

  • If x = f*(Wr-Wl), then sx = f*(Vr-Vl)

  • If x < Wl, then sx < Vl

  • If x > Wr, then sx > Vr

  • … also for y and sy


World window

World window

  • Pick size automatically

world window


Automatic setting to preserve aspect ratio center

window

Automatic setting to preserve aspect ratio & center

H

Aspect ratio R

W

R > W/H


Automatic setting to preserve aspect ratio center1

window

Automatic setting to preserve aspect ratio & center

H

Aspect ratio R

W

R < W/H


Clipping

Clipping

  • Lines outside of world window are not to be drawn.

  • Graphics API clips them automatically.

  • But clipping is a general tool in graphics!


Clipping1

Clipping


Clipping2

Clipping

A

B

clipSegment(…):

  • Return 1 if line within window

  • Return 0 if line outside window

  • If line partially inside, partially outside: clip and return 1

C

E

D


Cohen sutherland clipping

Cohen-Sutherland clipping

  • Trivial accept/reject test!

Trivial reject

Trivial accept


Cohen sutherland region outcodes

Cohen-Sutherland region outcodes

  • 4 bits:

    TTFF

Left of window?

Above window?

Right of window?

Below window?


Cohen sutherland region outcodes1

Cohen-Sutherland region outcodes

  • Trivial accept: both endpoints are FFFF

  • Trivial reject: both endpoints have T in the same position

TTFF

FTFF

FTTF

TFFF

FFFF

FFTF

TFFT

FFFT

FFTT


Cohen sutherland chopping

Cohen-Sutherland: chopping

  • If segment is neither trivial accept or reject:

    • Clip against edges of window in turn


Cohen sutherland chopping1

Cohen-Sutherland: chopping

Trivial accept


Cohen sutherland line clipper

Cohen-Sutherland line clipper

  • int clipSegment (point p1, point p2)

    Do {

    If (trivial accept) return (1)

    If (trivial reject) return (0)

    If (p1 is outside)

    if (p1 is left) chop left

    else if (p1 is right) chop right

    If (p2 is outside)

    } while (1)


Raster graphics

Raster Graphics

  • What is an image?

    • Array of pixels

  • How to convert lines and polygons to pixels?

    • Continuous to discrete

    • Scan conversion


Displays

Displays

  • Early displays were vector displays

    • Electron beam traces lines

    • Image is sequence of endpoints

    • Wireframes, no solid fills


Displays1

Displays

  • Raster displays

    • Electron beam traces regular pattern

    • Image is 2D array of pixels

    • Fast, but discretisation errors

  • Every pixel has b bits for color

    • B&W: 1 bit

    • Basic colors: 8, 15, 16, 24 bits

    • High-end: 96 bits


Displays2

Displays


Displays and framebuffers

Displays and Framebuffers

  • Raster image is stored in memory as a 2D array of pixels = framebuffer

  • The color of each pixel determines the intensity of the beam

  • Video hardware scans framebuffer at 60Hz

    • Changes in framebuffer show on screen => double buffering

    • Switch buffers when one buffer is finished


Displays and framebuffers1

Displays and Framebuffers

Framebuffer

(double buffer)

display

Video controller

Graphics software (rasterizer)


Rasterizer example

Rasterizer: Example

  • How to rasterize a line, once its 2D screen coordinates are known?

  • Given: endpoints of a line

  • What pixels to draw?


Scan converting lines

Scan converting lines


Scan converting lines1

Scan converting lines

  • find the pixels closest to the ideal line

  • assume slope m 1: illuminate one pixel per column, work incrementally

  • if m1 : x  y.


Scan converting lines2

Scan converting lines

y = y1;

for (i = x1; i<=x2; i++) {

plotPixel(i, round(y));

y += m;

}


Scan converting lines3

Scan converting lines

  • Inefficient: compute round(y) for each integer x and floating point addition

  • Bresenham’s algorithm: only integer arithmetic

  • Standard for most HW+SW rasterizers


Scan converting lines4

Scan converting lines

  • What’s the next pixel?

  • Decision variabled = a – bif (d>0) …else …

  • Or d = Dx(a-b)


Scan converting lines5

Scan converting lines

  • dk+1 = dk – 2Dy ordk+1 = dk – 2(Dy-Dx)


  • Login