Computer Graphics (CS 543) Lecture 4a: Linear Algebra for Graphics (Points, Scalars, Vectors)

Similar documents
Computer Graphics CS 543 Lecture 4 (Part 2) Building 3D Models (Part 2)

Building Models. CS 537 Interactive Computer Graphics Prof. David E. Breen Department of Computer Science

Building Models. Prof. George Wolberg Dept. of Computer Science City College of New York

OpenGL pipeline Evolution and OpenGL Shading Language (GLSL) Part 2/3 Vertex and Fragment Shaders

Lecture 7: Building 3D Models (Part 1) Prof Emmanuel Agu. Computer Science Dept. Worcester Polytechnic Institute (WPI)

Building Models. Objectives Introduce simple data structures for building polygonal models. Vertex lists Edge lists

CS 543: Computer Graphics Lecture 04 Part III: 3D Modeling: Polygonal Meshes. Emmanuel Agu

CS 4731/543: Computer Graphics Lecture 3 (Part III): 3D Modeling: Polygonal Meshes. Emmanuel Agu

Comp 410/510 Computer Graphics Spring Programming with OpenGL Part 2: First Program

CS452/552; EE465/505. Models & Viewing

Fog example. Fog is atmospheric effect. Better realism, helps determine distances

Tutorial 04. Harshavardhan Kode. September 14, 2015

CS 543 Lecture 1 (Part 3) Prof Emmanuel Agu. Computer Science Dept. Worcester Polytechnic Institute (WPI)

CS475/CS675 - Computer Graphics. OpenGL Drawing

Comp 410/510 Computer Graphics Spring Programming with OpenGL Part 4: Three Dimensions

Computer Graphics (CS 4731) OpenGL/GLUT (Part 2)

Computer Graphics (CS 543) Lecture 1 (Part 2): Introduction to OpenGL/GLUT (Part 1)

CS 432 Interactive Computer Graphics

Computer Graphics (CS 4731) Lecture 11: Implementing Transformations. Prof Emmanuel Agu. Computer Science Dept. Worcester Polytechnic Institute (WPI)

Computer Graphics (CS 4731) Lecture 11: Implementing Transformations. Prof Emmanuel Agu. Computer Science Dept. Worcester Polytechnic Institute (WPI)

8 Three-Dimensional Object Representations. Chapter 8. Three-Dimensional Object Representations. Department of Computer Science and Engineering 8-1

Computer Graphics (CS 543) Lecture 3b: Shader Setup & GLSL Introduction

CS 548: COMPUTER GRAPHICS PORTRAIT OF AN OPENGL PROGRAM SPRING 2015 DR. MICHAEL J. REALE

Programming with OpenGL Complete Programs Objectives Build a complete first program

Announcement. Homework 1 has been posted in dropbox and course website. Due: 1:15 pm, Monday, September 12

Computer Graphics (CS 543) Lecture 8c: Environment Mapping (Reflections and Refractions)

Texture Mapping. CS 537 Interactive Computer Graphics Prof. David E. Breen Department of Computer Science

Computer Graphics CS 543 Lecture 5 (Part 2) Implementing Transformations

CS452/552; EE465/505. Transformations

Information Coding / Computer Graphics, ISY, LiTH. OpenGL! ! where it fits!! what it contains!! how you work with it 11(40)

Recall: Indexing into Cube Map

Computer Graphics CS 543 Lecture 13a Curves, Tesselation/Geometry Shaders & Level of Detail

CS Computer Graphics: OpenGL, Continued

CS Computer Graphics: OpenGL, Continued

Building Models. Angel and Shreiner: Interactive Computer Graphics 7E Addison-Wesley 2015

CS452/552; EE465/505. Image Processing Frame Buffer Objects

CS452/552; EE465/505. Review & Examples

WebGL A quick introduction. J. Madeira V. 0.2 September 2017

Computer Graphics (CS 4731) OpenGL/GLUT(Part 1)

Computer Graphics (CS 4731) & 2D Graphics Systems

Computer Graphics (CS 543) Lecture 10: Soft Shadows (Maps and Volumes), Normal and Bump Mapping

Starting out with OpenGL ES 3.0. Jon Kirkham, Senior Software Engineer, ARM

3D Modeling. 3D Modeling 1

CS 432 Interactive Computer Graphics

Programming with OpenGL Part 5: More GLSL. Ed Angel Professor Emeritus of Computer Science University of New Mexico

CS452/552; EE465/505. Image Formation

Computer Graphics (CS 543) Lecture 1 (Part 1): Introduction to Computer Graphics

CS 450: COMPUTER GRAPHICS REVIEW: STATE, ATTRIBUTES, AND OBJECTS SPRING 2015 DR. MICHAEL J. REALE

Vertex Buffer Objects

Vertex Buffer Objects. Vertex Buffer Objects: The Big Idea

6.S096 Lecture 9 Visualization

Computer Graphics (CS 543) Lecture 9 (Part 2): Clipping. Prof Emmanuel Agu. Computer Science Dept. Worcester Polytechnic Institute (WPI)

Introduction to Computer Graphics with WebGL

Comp 410/510 Computer Graphics Spring Programming with OpenGL Part 3: Shaders

Shaders. Slide credit to Prof. Zwicker

Lecture 19: OpenGL Texture Mapping. CITS3003 Graphics & Animation

Building Models. Ed Angel Professor of Computer Science, Electrical and Computer Engineering, and Media Arts University of New Mexico

CS 4731 Lecture 3: Introduction to OpenGL and GLUT: Part II. Emmanuel Agu

Display Lists. Conceptually similar to a graphics file. In client-server environment, display list is placed on server

COMP371 COMPUTER GRAPHICS

Today s Agenda. Basic design of a graphics system. Introduction to OpenGL

Interaction. CSCI 420 Computer Graphics Lecture 3

Introduction to Computer Graphics with WebGL

Computer Graphics CS 543 Lecture 1 (Part I) Prof Emmanuel Agu. Computer Science Dept. Worcester Polytechnic Institute (WPI)

We assume that you are familiar with the following:

Objectives. Programming with OpenGL Part 5: More GLSL. Program Object. Reading a Shader. Shader Reader. Linking Shaders with Application

I think this assignment should have 8 objectives but we should still mark it out of 10. The Mean TA.

Rendering Objects. Need to transform all geometry then

Building Models. Objectives. Introduce simple data structures for building polygonal models. OpenGL vertex arrays. Vertex lists Edge lists

2/3/16. Interaction. Triangles (Clarification) Choice of Programming Language. Buffer Objects. The CPU-GPU bus. CSCI 420 Computer Graphics Lecture 3

Computer Graphics (CS 543) Lecture 8a: Per-Vertex lighting, Shading and Per-Fragment lighting

CHAPTER 1 Graphics Systems and Models 3

Computer Graphics. This Week. Meshes. Meshes. What is a Polygon Mesh? Meshes. Modelling Shapes with Polygon Meshes.

Tutorial 12: Real-Time Lighting B

Models and Architectures. Angel and Shreiner: Interactive Computer Graphics 7E Addison-Wesley 2015

Computer Graphics using OpenGL, 3 rd Edition F. S. Hill, Jr. and S. Kelley

CSE 167: Introduction to Computer Graphics Lecture #7: GLSL. Jürgen P. Schulze, Ph.D. University of California, San Diego Spring Quarter 2016

Today s Agenda. Shaders fundamentals. Programming with shader-based OpenGL

ERKELEY DAVIS IRVINE LOS ANGELES RIVERSIDE SAN DIEGO SAN FRANCISCO EECS 104. Fundamentals of Computer Graphics. OpenGL

To Do. Computer Graphics (Fall 2008) Course Outline. Course Outline. Methodology for Lecture. Demo: Surreal (HW 3)

Tutorial 1: Your First Triangle!

Computer Graphics (CS 543) Lecture 13b Ray Tracing (Part 1) Prof Emmanuel Agu. Computer Science Dept. Worcester Polytechnic Institute (WPI)

Interactive Computer Graphics A TOP-DOWN APPROACH WITH SHADER-BASED OPENGL

Three Main Themes of Computer Graphics

Computer Graphics (CS 543) Lecture 2b: 2D Graphics Systems (Drawing Polylines, tiling, & Aspect Ratio)

3D Graphics and OpenGl. First Steps

Exercise 1 Introduction to OpenGL

API Background. Prof. George Wolberg Dept. of Computer Science City College of New York

6.837 Introduction to Computer Graphics Final Exam Tuesday, December 20, :05-12pm Two hand-written sheet of notes (4 pages) allowed 1 SSD [ /17]

GEOMETRIC OBJECTS AND TRANSFORMATIONS I

The Application Stage. The Game Loop, Resource Management and Renderer Design

Programming with WebGL Part 1: Background. CS 432 Interactive Computer Graphics Prof. David E. Breen Department of Computer Science

Scalar Field Visualization I

Transformations. CS 537 Interactive Computer Graphics Prof. David E. Breen Department of Computer Science

We will use WebGL 1.0. WebGL 2.0 is now being supported by most browsers but requires a better GPU so may not run on older computers or on most cell

Computer Graphics Seminar

Computer Graphics (CS 4731) Lecture 16: Lighting, Shading and Materials (Part 1)

Computer Graphics (4731) Lecture 4: 2D Graphics Systems (Drawing Polylines, tiling, & Aspect Ratio)

Midterm Exam CS 184: Foundations of Computer Graphics page 1 of 11

Computer Graphics. Bing-Yu Chen National Taiwan University

Transcription:

Computer Graphics (CS 543) Lecture 4a: Linear Algebra for Graphics (Points, Scalars, Vectors) Prof Emmanuel Agu Computer Science Dept. Worcester Polytechnic Institute (WPI)

Announcements Sample exam 1 will be posted on class website Exam 1 next week in class, Sept 26 Exam review at the end of today s class Date change: Project 2 out next week, due Oct 10

Standard Unit Vectors Define y i j 1,0,0 0,1,0 k i k 0,0,1 0 j So that any vector, z x v a, b c ai bj ck,

Cross Product (Vector product) z y x a a a,, a z y x b b b,, b If Then k j i b a ) ( ) ( ) ( x y y x x z z x y z z y b a b a b a b a b a b a Remember using determinant z y x z y x b b b a a a k j i Note: a x b is perpendicular to a and b

Cross Product Note: a x b is perpendicular to both a and b a x b a 0 b

Cross Product (Vector product) Calculate a x b if a = (3,0,2) and b = (4,1,8) a 3,0,2 b 4,1,8 Using determinant i j k 3 0 2 4 1 8 Then a b ( 0 2) i (24 8) j (3 0) k 2i 16j 3k

Normal for Triangle using Cross Product Method plane n (p - p 0 ) = 0 n p 2 n = (p 2 - p 0 ) (p 1 - p 0 ) normalize n n/ n p p 0 p 1 Note that right-hand rule determines outward face

Newell Method for Normal Vectors Problems with cross product method: calculation difficult by hand, tedious If 2 vectors almost parallel, cross product is small Numerical inaccuracy may result p 1 Proposed by Martin Newell at Utah (teapot guy) Uses formulae, suitable for computer Compute during mesh generation Robust! p 0 p 2

Newell Method Example Example: Find normal of polygon with vertices P0 = (6,1,4), P1=(7,0,9) and P2 = (1,1,2) Using simple cross product: ((7,0,9)-(6,1,4)) X ((1,1,2)-(6,1,4)) = (2,-23,-5) P1 - P0 P2 - P0 P2 (1,1,2) PO (6,1,4) P1 (7,0,9)

Newell Method for Normal Vectors Formulae: Normal N = (mx, my, mz) m m m x y z N 1 i 0 N 1 i 0 N 1 i 0 y y z z i next( i) i next( i) z z x x i next( i) i next( i) x x y y i next( i) i next( i)

Newell Method for Normal Vectors Calculate x component of normal m x N 1 i 0 y y z z i next( i) i next( i) P0 x 6 y 1 z 4 m m m x x x (1)(13) ( 1)(11) (0)(6) 13 11 0 2 P1 P2 P0 7 1 6 0 1 1 9 2 4

Newell Method for Normal Vectors Calculate y component of normal m y N 1 i 0 z z x x i next( i) i next( i) P0 x 6 y 1 z 4 m m m y y y ( 5)(13) (7)(8) ( 2)(7) 65 56 14 23 P1 P2 P0 7 1 6 0 1 1 9 2 4

Newell Method for Normal Vectors Calculate z component of normal m m m m z z z z N 1 i 0 x x y y i next( i) i next( i) ( 1)(1) (6)(1) ( 5)(2) 1 6 10 5 P0 P1 P2 P0 x 6 7 1 6 y 1 0 1 1 z 4 9 2 4 Note: Using Newell method yields same result as Cross product method (2,-23,-5)

Finding Vector Reflected From a Surface a = original vector n = normal vector r = reflected vector m = projection of a along n e = projection of a orthogonal to n Note: Θ 1 = Θ 2 a n e a m r r e m m Θ 1 Θ 2 -m r a 2m e e

Forms of Equation of a Line Two-dimensional forms of a line Explicit: y = mx +h Implicit: ax + by +c =0 Parametric: x(a) = ax 0 + (1-a)x 1 y(a) = ay 0 + (1-a)y 1 Parametric form of line 1 - α More robust and general than other forms Extends to curves and surfaces P o α P α P 1

Convexity An object is convex iff for any two points in the object all points on the straight line between these points are also in the object P P Q Q convex not convex

References Angel and Shreiner, Interactive Computer Graphics, 6 th edition, Chapter 3 Hill and Kelley, Computer Graphics using OpenGL, 3 rd edition, Sections 4.2-4.4

Computer Graphics (CS 543) Lecture 4a: Building 3D Models Prof Emmanuel Agu Computer Science Dept. Worcester Polytechnic Institute (WPI)

3D Applications 2D points: (x,y) coordinates 3D points: have (x,y,z) coordinates

Setting up 3D Applications: Main Steps Programming 3D similar to 2D 1. Load representation of 3D object into data structure Each vertex has (x,y,z) coordinates. Store as vec3 NOT vec2 2. Draw 3D object 3. Set up Hidden surface removal: Correctly determine order in which primitives (triangles, faces) are rendered (e.g Blocked faces NOT drawn)

3D Coordinate Systems Vertex (x,y,z) positions specified on coordinate system OpenGL uses right hand coordinate system Y Y x +z +z x Right hand coordinate system Tip: sweep fingers x-y: thumb is z Left hand coordinate system Not used in OpenGL

Generating 3D Models: GLUT Models Make GLUT 3D calls in OpenGL program to generate vertices describing different shapes (Restrictive?) Two types of GLUT models: Wireframe Models Solid Models Solid models Wireframe models

3D Modeling: GLUT Models Basic Shapes Cone: glutwirecone( ), glutsolidcone( ) Sphere: glutwiresphere( ), glutsolidsphere( ) Cube: glutwirecube( ), glutsolidcube( ) More advanced shapes: Newell Teapot: (symbolic) Dodecahedron, Torus Sphere Cone Torus Newell Teapot

3D Modeling: GLUT Models Glut functions under the hood generate sequence of points that define a shape Generated vertices and faces passed to OpenGL for rendering Example: glutwirecone generates sequence of vertices, and faces defining cone and connectivity glutwirecone vertices, and faces defining cone OpenGL program (renders cone)

Polygonal Meshes Modeling with GLUT shapes (cube, sphere, etc) too restrictive Difficult to approach realism. E.g. model a horse Preferred way is using polygonal meshes: Collection of polygons, or faces, that form skin of object More flexible, represents complex surfaces better Examples: Human face Animal structures Furniture, etc Each face of mesh is a polygon

Polygonal Meshes Mesh = sequence of polygons forming thin skin around object OpenGL good at drawing polygons, triangles Meshes now standard in graphics Simple meshes exact. (e.g barn) Complex meshes approximate (e.g. human face)

Same Mesh at Different Resolutions Original: 424,000 triangles 60,000 triangles (14%). 1000 triangles (0.2%) (courtesy of Michael Garland and Data courtesy of Iris Development.)

Representing a Mesh Consider a mesh There are 8 vertices and 12 edges 5 interior polygons 6 interior (shared) edges (shown in orange) Each vertex has a location v i = (x i y i z i ) v 1 v 5 v 6 e e e 3 v 9 8 8 v e 4 1 e 6 e 7 e 11 v 2 e 2 e v 10 7 e 4 e 12 e v 5 3

Simple Representation Define each polygon by (x,y,z) locations of its vertices OpenGL code vertex[i] = vec3(x1, y1, z1); vertex[i+1] = vec3(x6, y6, z6); vertex[i+2] = vec3(x7, y7, z7); i+=3;

Issues with Simple Representation Declaring face f1 vertex[i] = vec3(x1, y1, z1); vertex[i+1] = vec3(x7, y7, z7); vertex[i+2] = vec3(x8, y8, z8); vertex[i+3] = vec3(x6, y6, z6); Declaring face f2 v 1 v 6 f 1 f 2 v8 v 7 v 5 v 4 vertex[i] = vec3(x1, y1, z1); vertex[i+1] = vec3(x2, y2, z2); vertex[i+2] = vec3(x7, y7, z7); v 2 v 3 Inefficient and unstructured Repeats: vertices v1 and v7 repeated while declaring f1 and f2 Shared vertices shared declared multiple times Delete vertex? Move vertex? Search for all occurences of vertex

Geometry vs Topology Geometry: (x,y,z) locations of the vertices Topology: How vertices and edges are connected Good data structures separate geometry from topology Example: A polygon is ordered list of vertices An edge connects successive pairs of vertices Topology holds even if geometry changes (vertex moves) v 6 v8 v 5 v 4 Example: even if we move (x,y,z) location of v1, v1 still connected to v6, v7 and v2 v 1 f 1 f 2 v 7 v 3 v 1 v 2

Polygon Traversal Convention Convention: traverse vertices counter-clockwise around normal Focus on direction of traversal Orders {v 1, v 0, v 3 } and {v 3, v 2, v 1 } are same (ccw) Order {v 1, v 2, v 3 } is different (clockwise) Normal vector: Direction each polygon is facing 4 5 3 6 1 2

Vertex Lists Vertex list: (x,y,z) of vertices (its geometry) are put in array Use pointers from vertices into vertex list Polygon list: vertices connected to each polygon (face) Topology example: Polygon P1 of mesh is connected to vertices (v1,v7,v6) P1 P2 P3 P4 P5 v 1 v 7 v 6 v 8 v 5 v 6 x 1 y 1 z 1 x 2 y 2 z 2 x 3 y 3 z 3 x 4 y 4 z 4 x 5 y 5 z 5. x 6 y 6 z 6 x 7 y 7 z 7 x 8 y 8 z 8 Geometry example: Vertex v7 coordinates are (x7,y7,z7). Note: If v7 moves, changed once in vertex list

Vertex List Issue: Shared Edges Vertex lists draw filled polygons correctly If each polygon is drawn by its edges, shared edges are drawn twice Alternatively: Can store mesh by edge list

Edge List Simply draw each edges once E.g e1 connects v1 and v6 e1 e2 e3 e4 e5 e6 e7 e8 e9 v1 v6 x 1 y 1 z 1 x 2 y 2 z 2 x 3 y 3 z 3 x 4 y 4 z 4 x 5 y 5 z 5. x 6 y 6 z 6 x 7 y 7 z 7 x 8 y 8 z 8 v 1 v 6 e 1 e 8 e 6 e 7 v e 5 2 e e 3 9 e v 8 11 e v 10 7 e 4 e 12 e v 3 5 v 2 Note polygons are not represented

Vertex Attributes (18, 34, 6) (20, 12, 18) (12, 6, 15) Vertices can have attributes Position (x, y, z) E.g (20, 12, 18) Color (R,G,B) E.g. (1,0,0 ) or (red) Normal (x,y,z) Texture coordinates

Vertex Attributes (18, 34, 6) (20, 12, 18) (12, 6, 15) Store vertex attributes in single Array (array of structures) Later: pass array to OpenGL, specify attributes, order, position using glvertexattribpointer Vertex 1 Attributes Vertex 2 Attributes x y z r g b s t s t x y z r g b s t s t Position Color Tex0 Tex1 Position Color Tex0 Tex1

Declaring Array of Vertex Attributes Consider the following array of vertex attributes Vertex 1 Attributes Vertex 2 Attributes x y z r g b s t s t x y z r g b s t s t Position Color Tex0 Tex1 Position Color Tex0 Tex1 0 1 2 3 So we can define attribute positions (per vertex) #define VERTEX_POS_INDEX 0 #define VERTEX_COLOR_INDEX 1 #define VERTEX_TEXCOORD0_INDX 2 #define VERTEX_TEXCOORD1_INDX 3

Declaring Array of Vertex Attributes Vertex 1 Attributes Vertex 2 Attributes x y z r g b s t s t x y z r g b s t s t Position Color Tex0 Tex1 Position Color Tex0 Tex1 3 floats 3 floats 2 floats 2 floats Also define number of floats (storage) for each vertex attribute #define VERTEX_POS_SIZE 3 // x, y and z #define VERTEX_COLOR_SIZE 3 // r, g and b #define VERTEX_TEXCOORD0_SIZE 2 // s and t #define VERTEX_TEXCOORD1_SIZE 2 // s and t #define VERTEX_ATTRIB_SIZE VERTEX_POS_SIZE + VERTEX_COLOR_SIZE + \ VERTEX_TEXCOORD0_SIZE + \ VERTEX_TEXCOORD1_SIZE

Declaring Array of Vertex Attributes Vertex 1 Attributes Vertex 2 Attributes x y z r g b s t s t x y z r g b s t s t Position Color Tex0 Tex1 Position Color Tex0 Tex1 0 floats 3 floats 6 floats 8 floats Define offsets (# of floats) of each vertex attribute from beginning #define VERTEX_POS_OFFSET 0 #define VERTEX_COLOR_OFFSET 3 #define VERTEX_TEXCOORD0_OFFSET 6 #define VERTEX_TEXCOORD1_OFFSET 8

Allocating Array of Vertex Attributes Vertex 1 Attributes Vertex 2 Attributes x y z r g b s t s t x y z r g b s t s t Position Color Tex0 Tex1 Position Color Tex0 Tex1 Allocate memory for entire array of vertex attributes Recall #define VERTEX_ATTRIB_SIZE VERTEX_POS_SIZE + VERTEX_COLOR_SIZE + \ VERTEX_TEXCOORD0_SIZE + \ VERTEX_TEXCOORD1_SIZE float *p = malloc(numvertices * VERTEX_ATTRIB_SIZE * sizeof(float)); Allocate memory for all vertices

Specifying Array of Vertex Attributes Vertex 1 Attributes Vertex 2 Attributes x y z r g b s t s t x y z r g b s t s t Position Color Tex0 Tex1 Position Color Tex0 Tex1 glvertexattribpointer used to specify vertex attributes Example: to specify vertex position attribute Position 0 3 values (x, y, z) glvertexattribpointer(vertex_pos_indx, VERTEX_POS_SIZE, Data is floats GL_FLOAT, GL_FALSE, VERTEX_ATTRIB_SIZE * sizeof(float), p); Data should not Be normalized glenablevertexattribarray(0); do same for normal, tex0 and tex1 Stride: distance between consecutive vertices Pointer to data

Full Example: Rotating Cube in 3D Desired Program behaviour: Draw colored cube Continuous rotation about X,Y or Z axis Idle function called repeatedly when nothing to do Increment angle of rotation in idle function Use 3-button mouse to change direction of rotation Click left button -> rotate cube around X axis Click middle button -> rotate cube around Y axis Click right button -> rotate cube around Z axis Use default camera If we don t set camera, we get a default camera Located at origin and points in the negative z direction

Cube Vertices point4 vertices[8] = { 0 point4( -0.5, -0.5, 0.5, 1.0 ), 1 point4( -0.5, 0.5, 0.5, 1.0 ), 2 point4( 0.5, 0.5, 0.5, 1.0 ), 3 point4( 0.5, -0.5, 0.5, 1.0 ), 4 point4( -0.5, -0.5, -0.5, 1.0 ), 5 point4( -0.5, 0.5, -0.5, 1.0 ), 6 point4( 0.5, 0.5, -0.5, 1.0 ), 7 point4( 0.5, -0.5, -0.5, 1.0 ) }; x y z 1 Declare array of (x,y,z,w) vertex positions for a unit cube centered at origin (Sides aligned with axes) color4 vertex_colors[8] = { color4( 0.0, 0.0, 0.0, 1.0 ), // black color4( 1.0, 0.0, 0.0, 1.0 ), // red color4( 1.0, 1.0, 0.0, 1.0 ), // yellow color4( 0.0, 1.0, 0.0, 1.0 ), // green color4( 0.0, 0.0, 1.0, 1.0 ), // blue color4( 1.0, 0.0, 1.0, 1.0 ), // magenta color4( 1.0, 1.0, 1.0, 1.0 ), // white color4( 0.0, 1.0, 1.0, 1.0 ) // cyan }; r g b 1 Declare array of vertex colors (set of RGBA colors vertex can have)

Color Cube // generate 6 quads, // sides of cube void colorcube() { quad( 1, 0, 3, 2 ); quad( 2, 3, 7, 6 ); quad( 3, 0, 4, 7 ); quad( 6, 5, 1, 2 ); quad( 4, 5, 6, 7 ); quad( 5, 4, 0, 1 ); } point4 vertices[8] = { 0 point4( -0.5, -0.5, 0.5, 1.0 ), 1 point4( -0.5, 0.5, 0.5, 1.0 ), point4( 0.5, 0.5, 0.5, 1.0 ), point4( 0.5, -0.5, 0.5, 1.0 ), 4 point4( -0.5, -0.5, -0.5, 1.0 ), 5 point4( -0.5, 0.5, -0.5, 1.0 ), point4( 0.5, 0.5, -0.5, 1.0 ), point4( 0.5, -0.5, -0.5, 1.0 ) }; 5 6 Function quad is Passed vertex indices 1 4 2 7 0 3

Quad Function d c d c c a b a a b // quad generates two triangles (a,b,c) and (a,c,d) for each face // and assigns colors to the vertices int Index = 0; // Index goes 0 to 5, one per vertex of face void quad( int a, int b, int c, int d ) { 0 a 1 b 2 c 3 a 4 c 5 d 0 1 2 3 4 colors[index] = vertex_colors[a]; points[index] = vertices[a]; Index++; colors[index] = vertex_colors[b]; points[index] = vertices[b]; Index++; colors[index] = vertex_colors[c]; points[index] = vertices[c]; Index++; colors[index] = vertex_colors[a]; points[index] = vertices[a]; Index++; colors[index] = vertex_colors[c]; points[index] = vertices[c]; Index++; 5 colors[index] = vertex_colors[d]; points[index] = vertices[d]; Index++; } quad 0 = points[0-5 ] quad 1 = points[6 11] quad 2 = points [12 17] etc Points[ ] array to be Sent to GPU Read from appropriate index of unique positions declared

Initialization I void init() { colorcube(); // Generates cube data in application using quads // Create a vertex array object GLuint vao; glgenvertexarrays ( 1, &vao ); glbindvertexarray ( vao ); // Create a buffer object and move data to GPU GLuint buffer; glgenbuffers( 1, &buffer ); glbindbuffer( GL_ARRAY_BUFFER, buffer ); glbufferdata( GL_ARRAY_BUFFER, sizeof(points) + sizeof(colors), NULL, GL_STATIC_DRAW ); points colors Points[ ] array of vertex positions sent to GPU colors[ ] array of vertex colors sent to GPU

Initialization II Send points[ ] and colors[ ] data to GPU separately using glbuffersubdata glbuffersubdata( GL_ARRAY_BUFFER, 0, sizeof(points), points ); glbuffersubdata( GL_ARRAY_BUFFER, sizeof(points), sizeof(colors), colors ); points colors // Load vertex and fragment shaders and use the resulting shader program GLuint program = InitShader( "vshader36.glsl", "fshader36.glsl" ); gluseprogram( program );

Initialization III // set up vertex arrays Specify vertex data GLuint vposition = glgetattriblocation( program, "vposition" ); glenablevertexattribarray( vposition ); glvertexattribpointer( vposition, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0) ); GLuint vcolor = glgetattriblocation( program, "vcolor" ); glenablevertexattribarray( vcolor ); glvertexattribpointer( vcolor, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(sizeof(points)) ); points colors Specify color data theta = glgetuniformlocation( program, "theta" ); Want to Connect rotation variable theta in program to variable in shader

Display Callback void display( void ) { glclear( GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT ); gluniform3fv( theta, 1, theta ); gldrawarrays( GL_TRIANGLES, 0, NumVertices ); } glutswapbuffers(); Draw series of triangles forming cube

Mouse Callback enum { Xaxis = 0, Yaxis = 1, Zaxis = 2, NumAxes = 3 }; void mouse( int button, int state, int x, int y ) { if ( state == GLUT_DOWN ) { switch( button ) { case GLUT_LEFT_BUTTON: axis = Xaxis; break; case GLUT_MIDDLE_BUTTON: axis = Yaxis; break; case GLUT_RIGHT_BUTTON: axis = Zaxis; break; } } } Select axis (x,y,z) to rotate around Using mouse click

Idle Callback void idle( void ) { theta[axis] += 0.01; if ( theta[axis] > 360.0 ) { theta[axis] -= 360.0; } The idle( ) function is called whenever nothing to do Use it to increment rotation angle in steps of theta = 0.01 around currently selected axis } glutpostredisplay(); void main( void ){ } glutidlefunc( idle ); Note: still need to: Apply rotation by (theta) in shader

References Angel and Shreiner, Interactive Computer Graphics, 6 th edition, Chapter 3 Hill and Kelley, Computer Graphics using OpenGL, 3 rd edition