1
play

1 Geometry Basic Setup 2 Cube geometry (for pillars) const GLfloat - PDF document

To Do Computer Graphics Continue working on HW 2. Can be difficult Class lectures, programs primary source CSE 167 [Win 17], Lecture 8: OpenGL 2 Can leverage many sources (GL(SL) book, excellent Ravi Ramamoorthi online documentation,


  1. To Do Computer Graphics § Continue working on HW 2. Can be difficult § Class lectures, programs primary source CSE 167 [Win 17], Lecture 8: OpenGL 2 § Can leverage many sources (GL(SL) book, excellent Ravi Ramamoorthi online documentation, see links class website) § It is a good idea to copy (and modify) relevant segments http://viscomp.ucsd.edu/classes/cse167/wi17 Methodology for Lecture Review of Last Demo § Make mytest1 more § Changed floor to all white, added global for teapot and teapotloc, moved geometry to new header file ambitious § Demo 0 [set DEMO to 4 all features] § Sequence of steps § Demo #include <GL/glut.h> //also <GL/glew.h>; <GLUT/glut.h> for Mac OS #include “ “ shaders.h ” ” #include “ “ geometry.h ” ” int mouseoldx, mouseoldy ; // For mouse motion GLfloat eyeloc = 2.0 ; // Where to look from; initially 0 -2, 2 GLfloat teapotloc = -0.5 ; // ** NEW ** where the teapot is located GLint animate = 0 ; // ** NEW ** whether to animate or not GLuint vertexshader, fragmentshader, shaderprogram ; // shaders const int DEMO = 0 ; // ** NEW ** To turn on and off features Outline Geometry Basic Setup 1 § Review of demo from last lecture const int numobjects = 2 ; // number of objects for buffer const int numperobj = 3 ; § Basic geometry setup for cubes (pillars), colors const int ncolors = 4 ; § Single geometric object, but multiple colors for pillars GLUint VAOs[numobjects+ncolors], teapotVAO; // VAO (Vertex Array Object) for each primitive object GLuint buffers[numperobj*numobjects+ncolors], teapotbuffers[3] ; // § Matrix Stacks and Transforms (draw 4 pillars) ** NEW ** List of buffers for geometric data GLuint objects[numobjects] ; // ** NEW ** For each object § Depth testing (Z-buffering) GLenum PrimType[numobjects] ; GLsizei NumElems[numobjects] ; § Animation (moving teapot) // For the geometry of the teapot § Texture Mapping (wooden floor) std::vector <glm::vec3> teapotVertices; std::vector <glm::vec3> teapotNormals; std::vector <unsigned int> teapotIndices; § Best source for OpenGL is the red book and GLSL book. Of course, this is more a reference manual than a textbook, and you are better off // To be used as a matrix stack for the modelview. implementing rather reading end to end. std::vector <glm::mat4> modelviewStack; 1

  2. Geometry Basic Setup 2 Cube geometry (for pillars) const GLfloat wd = 0.1 ; // ** NEW ** Floor Geometry is specified with a vertex array const GLfloat ht = 0.5 ; // ** NEW ** Same for other Geometry const GLfloat _cubecol[4][3] = { {1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}, {1.0, 1.0, enum {Vertices, Colors, Elements} ; // For arrays for object 0.0} } ; enum {FLOOR, CUBE} ; // For objects, for the floor const GLfloat cubeverts[8][3] = { {-wd, -wd, 0.0}, {-wd, wd, 0.0}, {wd, wd, 0.0}, {wd, -wd, 0.0}, const GLfloat floorverts[4][3] = { {-wd, -wd, ht}, {wd, -wd, ht}, {wd, wd, ht}, {-wd, wd, ht} {0.5, 0.5, 0.0}, {-0.5, 0.5, 0.0}, {-0.5, -0.5, 0.0}, {0.5, -0.5, } ; 0.0} GLfloat cubecol[12][3] ; } ; const GLubyte cubeinds[12][3] = { const GLfloat floorcol[4][3] = { {0, 1, 2}, {0, 2, 3}, // BOTTOM {1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}, {1.0, 1.0, 1.0} {4, 5, 6}, {4, 6, 7}, // TOP } ; {0, 4, 7}, {0, 7, 1}, // LEFT const GLubyte floorinds[1][6] = { {0, 1, 2, 0, 2, 3} } ; {0, 3, 5}, {0, 5, 4}, // FRONT const GLfloat floortex[4][2] = { {3, 2, 6}, {3, 6, 5}, // RIGHT {1.0, 1.0}, {0.0, 1.0}, {0.0, 0.0}, {1.0, 0.0} {1, 7, 6}, {1, 6, 2} // BACK } ; } ; Initialize Geometry Function Initialize Cubes with Colors 1 // This function takes in a vertex, color, index and type array void initobject(GLuint object, GLfloat * vert, GLint sizevert, GLfloat * col, GLint void initcubes(GLuint object, GLfloat * vert, GLint sizevert, GLubyte * sizecol, GLubyte * inds, GLint sizeind, GLenum type) { inds, GLint sizeind, GLenum type) { int offset = object * numperobj ; for (int i = 0; i < ncolors; i++) { glBindVertexArray(VAOs[object]); for (int j = 0; j < 8; j++) glBindBuffer(GL_ARRAY_BUFFER, buffers[Vertices + offset]); for (int k = 0; k < 3; k++) glBufferData(GL_ARRAY_BUFFER, sizevert, vert, GL_STATIC_DRAW); cubecol[j][k] = _cubecol[i][k]; // Use layout location 0 for the vertices glEnableVertexAttribArray(0); glBindVertexArray(VAOs[object + i]); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), 0); int offset = object * numperobj; glBindBuffer(GL_ARRAY_BUFFER, buffers[Colors + offset]); int base = numobjects * numperobj; glBufferData(GL_ARRAY_BUFFER, sizecol, col, GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, buffers[Vertices + offset]); // Use layout location 1 for the colors glBufferData(GL_ARRAY_BUFFER, sizevert, vert, GL_STATIC_DRAW); glEnableVertexAttribArray(1); // Use layout location 0 for the vertices glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), 0); glEnableVertexAttribArray(0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[Elements + offset]); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeind, inds, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), 0); PrimType[object] = type; glBindBuffer(GL_ARRAY_BUFFER, buffers[base + i]); NumElems[object] = sizeind; // Prevent further modification of this VAO by unbinding it glBufferData(GL_ARRAY_BUFFER, sizeof(cubecol), cubecol, GL_STATIC_DRAW); glBindVertexArray(0);} Initialize Cubes with Colors 2 Drawing with/without Colors ... // Use layout location 1 for the colors glEnableVertexAttribArray(1); // And a function to draw with them, similar to drawobject but with color glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 3 * void drawcolor(GLuint object, GLuint color) { sizeof(GLfloat), 0); glBindVertexArray(VAOs[object + color]); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[Elements + offset]); glDrawElements(PrimType[object], NumElems[object], GL_UNSIGNED_BYTE, 0); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeind, inds, GL_STATIC_DRAW); glBindVertexArray(0); PrimType[object] = type; } NumElems[object] = sizeind; // Prevent further modification of this VAO by unbinding it void drawobject(GLuint object) { glBindVertexArray(0); } glBindVertexArray(VAOs[object]); glDrawElements(PrimType[object], NumElems[object], GL_UNSIGNED_BYTE, 0); } //in init glBindVertexArray(0); initobject(FLOOR, (GLfloat *) floorverts, sizeof(floorverts), (GLfloat } *) floorcol, sizeof (floorcol), (GLubyte *) floorinds, sizeof (floorinds), GL_TRIANGLES) ; void loadteapot() // See source code for details if interested initcubes(CUBE, (GLfloat *)cubeverts, sizeof(cubeverts), (GLubyte *)cubeinds, sizeof(cubeinds), GL_TRIANGLES); loadteapot(); 2

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend