Herramientas de usuario

Herramientas del sitio


fw:ogl:xtra

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
fw:ogl:xtra [2012/05/17 10:58]
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]]
 +  * {{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. \\ 
 +  - 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 =====
fw/ogl/xtra.1337252331.txt.gz · Última modificación: 2020/05/09 09:24 (editor externo)