You are on page 1of 28

# Dar varias propiedades a los Primitivos de OpenGL

Curso: Graficación Prof. Gueorgi Khatchatourov

Contenido
• Cómo ver un polígono? • Con qué color ver un objeto? • Como llenar Polígonos, o re-visitando “Stippling” (ver “Other Primitives” de Chapter III
“Drawing in Space” de “OpenGL SuperBible”)

• • • •

Cómo tratar los polígonos no convexos Cómo tratar los polígonos no planos Usar “Stencil Buffer” (plantilla para pintar) Usar “Scissors” (tijeras)

glPolygonMode(GL_BACK. both front and back faces are drawn in the same way. use glPolygonMode().Regresar al indice • • • • Cómo ver un polígono?(I de II) Ver lo interior de un polígono? Ver ambos lados de un polígono? Ver un polígono desde ambos lados? Ver los bordes de un polígono ? ----------------------------------------------------------------------------------------------------------------------Polygons as Points. or GL_BACK.front and back . Outlines. outlined. GL_LINE. For example. GL_LINE). void glPolygonMode(GLenum face. or to draw only outlines or vertices. By default. or filled. The parameter face can be GL_FRONT_AND_BACK. GL_FILL). • • • By default.     _ Controls the drawing mode for a polygon's front and back faces. mode can be GL_POINT. GL_FRONT.and might be rendered differently depending on which side is facing the viewer. or Solids A polygon has two sides . . both the front and back faces are drawn filled. or GL_FILL to indicate whether the polygon should be drawn as points. you can have the front faces filled and the back faces outlined with two calls to this routine: glPolygonMode(GL_FRONT. To change this. GLenum mode).

. culling must be enabled using glEnable() with GL_CULL_FACE. GL_BACK. it can be disabled with glDisable() and the same argument. El mode es uno de GL_FRONT. – Cambia el sentido de los lados frontales y traseras glFrontFace(GL_CW). Indica cuales polígonos deben ser eliminados (culled) antes que se convierten en las coordenadas de pantalla. To take effect. reverso o todos los polígonos. o GL_FRONT_AND_BACK para indicar el lado anverso.Regresar al indice Cómo ver un polígono?(II de II): Ver ambos lados de un polígono? Los controles para cambiar manera de ver diferentes lados de un polígono son: – Prender/apagar eliminación de las superficies ocultas () glCullFace void glCullFace(GLenum mode).

de material? ----------------------------------------------------------------------------- • Mecanísmos de formación de color de un pixel .Regresar al índice Con qué color ver un objeto? Con que color ver lo interior de un objeto? Cómo el color interior de un polígono depende de los vértices? Cómo lo depende de propiedades de luz.

void glEdgeFlag(GLboolean flag). the edge flag is set to TRUE (the default). void glEdgeFlagv(const GLboolean *flag). triangles. Indicates whether a vertex should be considered as initializing a boundary edge of a polygon. It is used between glBegin() and glEnd() pairs. not to those specified for strips of triangles or quads. and it affects all the vertices specified after it until the next glEdgeFlag() call is made. and any vertices created are considered to precede boundary edges until this function is called again with flag being GL_FALSE.ir al índice Cómo tratar los polígonos no convexos (I de II) • Figure 2-12 : Subdividing a Nonconvex Polygon you can manually control the setting of the edge flag with the command glEdgeFlag*(). If flag is GL_TRUE. It applies only to vertices specified for polygons. and quads. .

glEdgeFlag(GL_TRUE). glEnd(). glBegin(GL_POLYGON). glEdgeFlag(GL_TRUE). Example 2-7 : Marking Polygon Boundary Edges glPolygonMode(GL_FRONT_AND_BACK. glVertex3fv(V0). . glVertex3fv(V1).ir al índice Cómo tratar los polígonos no convexos (II de II) Figure 2-13 : Outlined Polygon Drawn Using Edge Flags Example 2-7 draws the outline shown in Figure 2-13. glVertex3fv(V2). GL_LINE). glEdgeFlag(GL_FALSE).

Cómo tratar los polígonos no planos .

Regresar al índice Usar “Stencil Buffer” (plantilla para pintar) Frequently. In the real world. the value in the stencil buffer is modified. the stencil test always passes. Depending on the result of the test. we want to mask out an irregularly shaped area using a stencil pattern. Figure shows how this process works.) Stenciling applies a test that compares a reference value with the value stored at a pixel in the stencil buffer. The stencil test takes place only if there is a stencil buffer. El stencil test modifica contenido del pixel en stencil buffer basandose en el resultado de una comparición del valor de referencia con el valor en el stencil buffer . a stencil is a flat piece of cardboard or other material that has a pattern cut out of it. (If there is no stencil buffer. Painters use the stencil to apply paint to a surface using the pattern in the stencil.

Regresar al índice Usar “Stencil Buffer” (II) ir al inicio del stencil buffer • void init (void) { …. } . glClearStencil(0x0)./*specifica el valor del vacio para el "stencil buffer"*/ glEnable(GL_STENCIL_TEST).

Ir a lamina anterior Usar “Stencil Buffer” (III): lógica del uso ir al inicio del stencil buffer // especifica tipo de comparición para “stencil test” • glStencilFunc ( // establece la función y el valor de referencia para “stencil test” GLenum func. Por ejemplo. // valor de referencia. GLuint mask ). si func=GL_EQUAL Entonces. // máscara. el pixel pasa satisfactoriamente la prueba (stencil test) siempre y cuando se cumple (ref&mask)=(stencil&mask) } . GLint ref.

Regresar al índice Usar “Stencil Buffer” (IV) ir al inicio del stencil buffer • { void display(void) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT).275. /* draw the tori where the stencil is not 1 */ glStencilFunc (GL_NOTEQUAL. 15). GL_KEEP. glPopMatrix().5. glutSolidSphere (0.0. 0. glutSolidTorus (0. //Ver un ejemplo de lógica de uso de los parametros //define la acción del stencil test } . 0. 0.0. 15).85. glCallList (YELLOWMAT). glPushMatrix(). 0.0.275.0. 0. /* draw blue sphere where the stencil is 1 */ glStencilFunc (GL_EQUAL. glPushMatrix(). 0x1).85.0. 0x1 ).0. glPopMatrix(). 1. 0. glutSolidTorus (0.0. 1.0. 15. glRotatef (45. GL_KEEP). glCallList (BLUEMAT).0). glRotatef (45. 0x1. glStencilOp (GL_KEEP.0.0). glRotatef (90.0). 0x1. 15). 0. 15. 1. 15. 0.

0. glMatrixMode(GL_MODELVIEW). 0x1. 1. glBegin(GL_QUADS).0. glStencilFunc (GL_ALWAYS. } . 7.0. GL_REPLACE).Regresar al índice Usar “Stencil Buffer” (V) ir al inicio del stencil buffer void reshape(int w. glVertex2f (1. -5. GL_REPLACE.0).0). glVertex2f (0. glMatrixMode(GL_PROJECTION).0. glLoadIdentity(). 0. glVertex2f (0. glLoadIdentity().0. 3. glLoadIdentity().0. (GLfloat) w/(GLfloat) h. glStencilOp (GL_REPLACE. glVertex2f (-1.0). glClear(GL_STENCIL_BUFFER_BIT). glEnd(). gluPerspective(45. 0.0). -1. int h) {…. 0x1).0). glMatrixMode(GL_MODELVIEW).0. glTranslatef(0.0.0).0.

OpenGL allows you to specify a scissor rectangle within your window where rendering can take place.ir al indice de la presentacion Usar “Scissors” (tijeras) (I de III) • One way to improve rendering performance is to update only the portion of the screen that has changed. • You can turn off the scissor test again with the corresponding glDisable function call. . By default. You may also need to restrict OpenGL rendering to a smaller rectangular region inside the window. You turn on the scissor test with: • glEnable(GL_SCISSOR_TEST). the scissor rectangle is the size of the window. and no scissor test takes place.

0.0f). glScissor(200. // Turn scissor back off for next render glDisable(GL_SCISSOR_TEST). 0. glEnable(GL_SCISSOR_TEST).0f.0f. 200.0f. 0. } .0f.0f. 0.ir al indice de la presentacion Usar “Scissors” (tijeras) (II de III) • Listing 3.0f. glClear(GL_COLOR_BUFFER_BIT).0f. 100.0f). glutSwapBuffers(). glScissor(100. 200).0f. 1.0f). an even smaller green rectangle glClearColor(0. // Finally. // Now set scissor to smaller red sub region glClearColor(1. glClear(GL_COLOR_BUFFER_BIT). glClear(GL_COLOR_BUFFER_BIT). 0. 1.0f. 400.13. 400). 0. 0. Using the Scissor Box to Render a Series of Rectangles void RenderScene(void) { // Clear blue window glClearColor(0. 600.

Usar “Scissors” (tijeras): salida del programa (III de III) ir al indice de la presentacion .

and the one on the right shows the back side of the triangle. .15 shows the front of the triangle. This means that the triangle on the left in Figure 3. considers polygons that have counterclockwise winding to be front facing. by default.Regresar a Cómo ver un polígono Orientación de polígonos (I de II) • OpenGL.

To change back to counterclockwise winding for the front face. "Color. Materials.Regresar a “Cómo ver un polígono” Orientación de polígonos (II de II) regresar a I de II • you will often want to give the front and back of a polygon different physical characteristics. . • If you need to reverse the default behavior of OpenGL. use GL_CCW. you can do so by calling the following function: glFrontFace(GL_CW). • The GL_CW parameter tells OpenGL that clockwisewound polygons are to be considered front facing. using front-facing polygons to draw the outside surface of any solid objects. You can hide the back of a polygon altogether or give it a different color and reflective property (see SuperBibliaOPenGL Chapter 5. It's important to keep the winding of all polygons in a scene consistent. and Lighting: The Basics").

Mecanísmos de formación de color de un pixel ir al Con ir al indice de la presentacion que color… • Limpiar el buffer de color y dar un color para todos los píxeles desocupados • Lógica de coloración de OpenGL Color solido (GL_FLAT) o interpolado (GL_SMOOTH) • Los factores geométricos y físicos que influyen a la percepción de luz y generación del color final de un píxel .

// dar color a los pixeles desocupados • glClearColor (…).ir al indice de la presentacion Mecanísmos de formación de color Limpiar el buffer de color y dar un color para los pixeles desocupados ir al indice de de un pixel: mecanísmos de coloracion // limpia el buffer de color • glClear(GL_COLOR_BUFFER_BIT). .

The command on the fourth line that sets the current color to green is wasted.ir al indice de la presentacion Mecanísmos de formación de color de un pixel: Lógica de coloración de OpenGL ir al indice de mecanísmos de coloracion Podemos considerar la coloración de un objeto como dar una pintura al objeto sin tomar en cuenta cómo lo se verá en una posición especifica respecto a una camara. draw_object(B). all objects are drawn in that color or using that coloring scheme. En este sentido hay dos opciones (dos modelos de “SHADING”) de pintura: • con un color sólido (GL_FLAT) • con lo interpolado (GL_SMOOTH) ------------------------------------------------------------------------------------------------------In general. an OpenGL programmer first sets the color or coloring scheme and then draws the objects. the pseudocode set_current_color(red). Until the color or coloring scheme is changed. set_current_color(green). . and object C in blue. This method helps OpenGL achieve higher drawing performance than would result if it didn't keep track of the current color. draw_object(A). draw_object(C). For example. draws objects A and B in red. o de que material se ha hecho o cuanto y cuales luces se tienen en el entorno. set_current_color(blue).

glEnd ().1: Color solido (GL_FLAT) ir al indice de mecanísmos de coloracion Por omisión se supone que el modelo de coloración es como después del comando glShadeModel (GL_FLAT). no green. no blue.0.ir al indice Lógica de coloración de OpenGL (II de ) : Color solido o interpolado: lamina II. glColor3f (1. /* the current RGB color is red: */ /* full red. */ glBegin (GL_POINTS).0).0. . 0. 0. glVertex3fv (point_array).

1. } void display(void) { glClear (GL_COLOR_BUFFER_BIT).0). glVertex2f (5. glBegin (GL_TRIANGLES).0.0). 1. } .0.0.0). glColor3f (0.0).0.0. 0. 0. • #include <GL/glut.h> void init(void) { glClearColor (0.0.0). glEnd().2: Color interpolado (GL_SMOOTH). 0.0. 5. glColor3f (1.0. 5. glFlush (). 0. 0.0.0. glVertex2f (25.0.0).ir al indice Lógica de coloración de OpenGL (II de ) : Color solido o interpolado: ir al indice de mecanísmos de coloracion lamina II. glColor3f (0. 0. 0. glVertex2f (5. 25.0). glShadeModel (GL_SMOOTH).0.

return 0. glutMainLoop().0. 30. glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB). else gluOrtho2D (0.0*(GLfloat) w/(GLfloat) h. } . glMatrixMode(GL_MODELVIEW). glutReshapeFunc(reshape).0*(GLfloat) h/(GLfloat) w).0. 100). (GLsizei) h). void reshape (int w. glutCreateWindow (argv[0]). } int main(int argc. glMatrixMode (GL_PROJECTION). glLoadIdentity (). 30. 30.ir al indice Lógica de coloración de OpenGL (II de ) : Color solido o interpolado: ir al indice de mecanísmos de coloracion lamina II. 0.0). (GLsizei) w. if (w <= h) gluOrtho2D (0. 0.0. 500). glutInitWindowSize (500. int h) { glViewport (0. 30. 0.0. init ().0. glutInitWindowPosition (100.2': Color interpolado (GL_SMOOTH). glutDisplayFunc(display). argv). char** argv) { glutInit(&argc.

cómo los polígonos se usan los triángulos a los cuales previamente se calculan y se adjuntan vectores normales • Los factores físicos incluyen color del objeto. sino para polígonos enteros. tomando en cuenta esos factores. posición(es) del(as) fuentes de luz. propiedades de reflexión del material. el paradigma de OpenGL supone procesamiento de color final no para los puntos individuales. – Para mejorar rendiminto. propiedades (de transparencia y de iluminación) del medio ambiente . para evitar varios efectos de mal interpretación. En su vez.Los factores geométricos y físicos que influyen a la percepción de luz y la generación del ir al índice color final de un píxel ir al índice de mecanísmos de coloracion • Los factores geometricos incluyen posicion y orientacion espacial del objeto y de la cámara.

• The first rule is that all polygons must be planar. as illustrated in Figure 3. all the vertices of the polygon must lie in a single plane. The polygon cannot twist or bend in space. Planar versus nonplanar polygons. .Regla I de Construcción de Polígonos regresar a “factores geométricos y físicos que influyen…” When you are using many polygons to construct a complex surface. you need to remember two important rules.31. • Figure 3. That is.31.

the polygon is not convex. Figure 3.Regla II de Construcción de Polígonos regresar a “factores geométricos y físicos que influyen…” • The second rule of polygon construction is that the polygon's edges must not intersect. Some valid and invalid primitive polygons.32. • Figure 3. If any given line enters and leaves the polygon more than once. and the polygon must be convex. .32 gives examples of good and bad polygons.

all three stencil operations are GL_KEEP. zfail. GL_ZERO. or GL_INVERT. GL_REPLACE. • By default. then zfail is applied if the depth test fails and zpass if the depth test passes. and zpass can be GL_KEEP. or if no depth test is performed. GLenum zfail. GL_DECR. . if it passes.Regresar al índice Usar “Stencil Buffer” (IV’): la acción del stencil test ir atras • void glStencilOp( GLenum fail. • The value of any of fail. • The fail function is applied if the fragment fails the stencil test. GL_INCR. GLenum zpass ).