Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
fw:ogl:xtra [2012/05/17 11:02] alfred |
fw:ogl:xtra [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 302: | Línea 302: | ||
| </code> | </code> | ||
| Debemos recordar activar la GL_TEXTURE0, al acabar de definir las anteriores, que es por la que trabajamos por defecto. | Debemos recordar activar la GL_TEXTURE0, al acabar de definir las anteriores, que es por la que trabajamos por defecto. | ||
| + | |||
| ==== Polygon Tesselation ==== | ==== Polygon Tesselation ==== | ||
| * [[http://www.songho.ca/opengl/gl_tessellation.html]] | * [[http://www.songho.ca/opengl/gl_tessellation.html]] | ||
| * {{fw:ogl:polygon_tesselation_examples.zip|Ejemplos}} | * {{fw:ogl:polygon_tesselation_examples.zip|Ejemplos}} | ||
| - | Para dibujar polígonos concavos (que desde cualquier punto NO se puede trazar una línea a otro punto del polígono sin dejar de pasar por su superficie) es necesario utilizar esta técnica. | + | Para dibujar polígonos concavos (que desde cualquier punto NO se puede trazar una línea a otro punto del polígono sin dejar de pasar por su superficie) es necesario utilizar esta técnica. \\ |
| + | - Crearemos con ''gluNewTess'' (y al final destruiremos con ''gluDeleteTess'') un objeto ''GLUtessellator''. | ||
| + | - Indicaremos qué funciones se utilizarán para dibujar con ''gluTessCallback'', estas funciones podrán ser para iniciar la figura con el parámetro ''GLU_TESS_BEGIN'', para dibujar un vértice con ''GLU_TESS_VERTEX''... | ||
| + | - Indicaremos las propiedades de dibujo del polígono con ''glPolygonMode''. | ||
| + | - Iniciaremos el dibujo de un polígono con ''gluTessBeginPolygon'' y lo finalizaremos con ''gluTessEndPolygon''. | ||
| + | - Añadiremos porciones del polígono (por ejemplo, puede que tenga agujeros, cada polígono dentro del polígono se representa con estas rutinas) mediante ''gluTessBeginContour'' y ''gluTessEndContour''. | ||
| + | - Añadiremos vértices con ''gluTessVertex''. | ||
| + | <code cpp> | ||
| + | void tessVertexCB2(const GLvoid *data) { | ||
| + | const GLdouble *ptr = (const GLdouble*)data; | ||
| + | glTexCoord2dv(ptr+2); | ||
| + | glVertex3dv(ptr); | ||
| + | } | ||
| + | void tessVertexCB(const GLvoid *data) { | ||
| + | const GLdouble *ptr = (const GLdouble*)data; | ||
| + | glColor3dv(ptr+3); | ||
| + | glVertex2dv(ptr); | ||
| + | cout << " glColor3d(" << *(ptr+3) << ", " << *(ptr+4) << ", " << *(ptr+5) << ");\n"; | ||
| + | cout << " glVertex3d(" << *ptr << ", " << *(ptr+1) << ", " << *(ptr+2) << ");\n"; | ||
| + | } | ||
| + | void TessCombine(double coords[3],double* data[4],float weight[4],double** result) { | ||
| + | *result = (double*) malloc(3 * sizeof(double)); | ||
| + | (*result)[0] = coords[0]; | ||
| + | (*result)[1] = coords[1]; | ||
| + | (*result)[2] = coords[2]; | ||
| + | } | ||
| + | void TessError(GLenum err) { | ||
| + | fprintf(stderr,"Tessellation Error: %s\n",gluErrorString(err)); | ||
| + | exit(1); | ||
| + | } | ||
| + | void display(void) | ||
| + | { | ||
| + | GLdouble vertices[4][4] = { {-0.5,-0.5, 1.0, 1.0}, {-0.5,0.5, 1, 0}, {0.5,0.5, 0,0}, {0.5,-0.5, 0,1} }; | ||
| + | |||
| + | glClear(GL_COLOR_BUFFER_BIT); | ||
| + | glBindTexture(GL_TEXTURE_2D, texture); | ||
| + | |||
| + | GLUtesselator *tess = gluNewTess(); | ||
| + | glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); | ||
| + | |||
| + | gluTessCallback(tess, GLU_TESS_BEGIN, (GLvoid (*) ()) &glBegin); | ||
| + | // gluTessCallback(tess,GLU_TESS_VERTEX ,(GLvoid (*) ()) &glVertex2dv); | ||
| + | gluTessCallback(tess,GLU_TESS_VERTEX ,(GLvoid (*) ()) &tessVertexCB2); | ||
| + | gluTessCallback(tess, GLU_TESS_END, (GLvoid (*) ()) &glEnd); | ||
| + | gluTessCallback(tess,GLU_TESS_COMBINE,(GLvoid (*) ()) &TessCombine); | ||
| + | gluTessCallback(tess,GLU_TESS_ERROR ,(GLvoid (*) ()) &TessError); | ||
| + | |||
| + | gluTessBeginPolygon(tess, NULL); | ||
| + | gluTessBeginContour(tess); | ||
| + | for (int k=0; k<4; k++) { | ||
| + | gluTessVertex(tess, vertices[k], vertices[k]); | ||
| + | } | ||
| + | gluTessEndContour(tess); | ||
| + | gluTessEndPolygon(tess); | ||
| + | |||
| + | gluDeleteTess(tess); | ||
| + | |||
| + | glFlush(); | ||
| + | glutSwapBuffers(); | ||
| + | } | ||
| + | </code> | ||
| ===== Carga de imágenes ===== | ===== Carga de imágenes ===== | ||