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 [2008/08/29 17:49] alfred |
fw:ogl:xtra [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 2: | Línea 2: | ||
| ===== Más funciones y trucos con OpenGL ===== | ===== Más funciones y trucos con OpenGL ===== | ||
| + | |||
| Línea 53: | Línea 54: | ||
| cosf(x), sinf(y), 0.0f); | cosf(x), sinf(y), 0.0f); | ||
| </code> | </code> | ||
| + | === Ejemplos === | ||
| + | * {{fw:ogl:matrixprojection.zip|Ejemplo}} | ||
| ==== Cambiar de repente vista perspectiva a ortogonal ==== | ==== Cambiar de repente vista perspectiva a ortogonal ==== | ||
| Línea 250: | Línea 253: | ||
| * GL_SAMPLE_ALPHA_TO_ONE. Con alpha a 1. | * GL_SAMPLE_ALPHA_TO_ONE. Con alpha a 1. | ||
| * GL_SAMPLE_COVERAGE. Con alpha y el valor pasado a ''glSampleCoverage'', esta función permite especificar un valor de alpha. | * GL_SAMPLE_COVERAGE. Con alpha y el valor pasado a ''glSampleCoverage'', esta función permite especificar un valor de alpha. | ||
| + | |||
| Línea 298: | 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 ==== | ||
| + | * [[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 ===== | ||
| Línea 897: | Línea 967: | ||
| - | ===== OpenGL en Linux ===== | ||
| - | Antes de empezar a desarrollar para Linux en OpenGL es necesario saber si nuestro sistema puede renderizar código OpenGL, para ello utilizaremos el comando ''glxinfo'' de la siguiente forma: | ||
| - | <code> | ||
| - | glxinfo | grep "rendering" | ||
| - | </code> | ||
| - | Este comando puede servirnos también para saber qué versión tenemos y la marca de los drivers: | ||
| - | <code> | ||
| - | glxinfo | grep "version" | ||
| - | glxinfo | grep "vendor" | ||
| - | </code> | ||
| - | Para comprobar el funcionamiento de OpenGL en Linux ejecutaremos el comando ''glxgears''. \\ | ||
| - | En caso de no funcionar deberíamos instalar [[http://www.mesa3d.org/|Mesa 3d]]. | ||
| - | ==== X11 ==== | ||
| - | Al desarrollar en X11 será necesario hacer dos cosas: | ||
| - | * Añadir la librería ''X11'' al preprocesador compilando con: ''-lX11'' | ||
| - | * Incluir dicha librería, con: ''#include <X11/Xlib.h> '' | ||
| - | Una vez realizados los pasos anteriores podremos usar las funciones para el servidor X. Las que nos importan ahora son: | ||
| - | * **XOpenDisplay** para que devuelva el objeto ''Display'' sobre el que se creará la ventana, para ello le preguntamos al sistema utilizando la función ''getenv''. | ||
| - | * **XCloseDisplay** para liberar el objeto ''Display''. | ||
| - | <code cpp> | ||
| - | Display *dpy = XOpenDisplay(getenv("DISPLAY")); | ||
| - | XCloseDisplay(dpy); | ||
| - | </code> | ||
| ===== Detalle de funciones ===== | ===== Detalle de funciones ===== | ||