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 [2008/09/22 10:07]
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 (X Window) ==== 
-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>​ 
- 
-==== GLX ==== 
-GLX es la librería que proporciona un enlace entre las X y OpenGL activando la posibilidad de dibujo 3d sobre las ventanas. Para desarrollar con esta debemos añadir la librería **GL** (compilando con ''​-lGL''​). \\  
-La versión actual de GLX es la 1.3 que corresponde a la OpenGL 1.2. \\  
  
-===== OpenGL ES ===== 
  
 ===== Detalle de funciones ===== ===== Detalle de funciones =====
fw/ogl/xtra.1222078055.txt.gz · Última modificación: 2020/05/09 09:24 (editor externo)