Herramientas de usuario

Herramientas del sitio


fw:ogl

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 [2008/07/08 11:53]
alfred
fw:ogl [2020/05/09 09:25] (actual)
Línea 122: Línea 122:
 } }
 </​code>​ </​code>​
 +
  
  
Línea 138: Línea 139:
   * ''​glEnable(elemento);''​ y ''​glDisable(elemento);''​. Activa o desactiva el elemento que se pasa por parámetro, si luego queremos saber si ese parámetro está activo tendremos que pasarselo a ''​glIsEnabled(elemento);''​. El parámetro puede ser cualquiera de los siguientes tipos ya definidos:   * ''​glEnable(elemento);''​ y ''​glDisable(elemento);''​. Activa o desactiva el elemento que se pasa por parámetro, si luego queremos saber si ese parámetro está activo tendremos que pasarselo a ''​glIsEnabled(elemento);''​. El parámetro puede ser cualquiera de los siguientes tipos ya definidos:
     * GL_LINE_STIPPLE:​ Formato para las GL_LINES.     * GL_LINE_STIPPLE:​ Formato para las GL_LINES.
-    * GL_CULL_FACE:​ Hace que se pinte sólo por la cara de delante. Con esto hacemos uso del //​culling//,​ la técnica de eliminar los polígonos que no van a verse permitiendo así una mejora significante de rendimiento;​ pero cuidado al dibujar, has de tener en cuenta si has de dibujar en el sentido de las agujas del reloj ''​glFrontFace(GL_CCW)''​ o no ''​glFrontFace(GL_CW)''​.+    * GL_CULL_FACE:​ Hace que se pinte sólo por la cara de delante. Con esto hacemos uso del //​culling//,​ la técnica de eliminar los polígonos que no van a verse permitiendo así una mejora significante de rendimiento;​ pero cuidado al dibujar, has de tener en cuenta si has de dibujar en el sentido de las agujas del reloj ''​glFrontFace(GL_CCW)''​ o no ''​glFrontFace(GL_CW)''​. Por defecto se dibuja en sentido contrario a las agujas del reloj.
     * GL_DEPTH_TEST:​ Elimina las caras ocultas por otras, si no se pone las últimas caras dibujadas (aunque estén por debajo de otras) saldrán por encima. Necesita del parámetro GL_DEPTH_BUFFER_BIT en el glClear. Por lo visto no hay feeling con el GL_CULL_FACE activado.     * GL_DEPTH_TEST:​ Elimina las caras ocultas por otras, si no se pone las últimas caras dibujadas (aunque estén por debajo de otras) saldrán por encima. Necesita del parámetro GL_DEPTH_BUFFER_BIT en el glClear. Por lo visto no hay feeling con el GL_CULL_FACE activado.
     * GL_LIGHTING:​ Activa los parámetros de iluminación.     * GL_LIGHTING:​ Activa los parámetros de iluminación.
Línea 226: Línea 227:
   * **Viewport**:​ El render 2d sobre la ventana.   * **Viewport**:​ El render 2d sobre la ventana.
   * **Modelview**:​ La combinación entre las transformaciones de la vista y los modelos (la matriz del modelador).   * **Modelview**:​ La combinación entre las transformaciones de la vista y los modelos (la matriz del modelador).
 +
 +
  
  
Línea 231: Línea 234:
 OpenGL utiliza matrices para manejar los datos, existen tres tipos\modos y la elección de este "modo de matriz"​ se lleva a cabo según el parámetro que le pasemos a ''​glMatrixMode'':​ OpenGL utiliza matrices para manejar los datos, existen tres tipos\modos y la elección de este "modo de matriz"​ se lleva a cabo según el parámetro que le pasemos a ''​glMatrixMode'':​
   * GL_MODELVIEW:​ Pila de matrices del modelador (para dibujar en escena).   * GL_MODELVIEW:​ Pila de matrices del modelador (para dibujar en escena).
-  * GL_PROJECTION:​ Pila de matrices de la proyección (para definir el volumen de trabajo).+  * GL_PROJECTION:​ Pila de matrices de la proyección (para definir el volumen de trabajo). En este modo utilizaremos únicamente las siguientes funciones, no más (la cámara (''​gluLookAt''​) se utiliza en la MODELVIEW): ''​glLoadIdentity,​ gluPerspective,​ glFrustum, glOrtho, gluOrtho2''​.
   * GL_TEXTURE: Pila de matrices de textura (coordenadas de textura).   * GL_TEXTURE: Pila de matrices de textura (coordenadas de textura).
- 
- 
- 
  
 ==== Matriz del modelador (o matriz general) ==== ==== Matriz del modelador (o matriz general) ====
Línea 241: Línea 241:
   * **Movimiento** con las funciones tipo ''​glTranslatef(X,​Y,​Z);''​   * **Movimiento** con las funciones tipo ''​glTranslatef(X,​Y,​Z);''​
   * **Rotacion** con las funciones tipo  ''​glRotatef(Angulo,​ X, Y, Z);''​   * **Rotacion** con las funciones tipo  ''​glRotatef(Angulo,​ X, Y, Z);''​
-  * **Escalado** con las funciones tipo  ''​glScalef(X,​Y,​Z);'' ​\\ +  * **Escalado** con las funciones tipo  ''​glScalef(X,​Y,​Z);''​. Esta función no hace nada si se le llama como ''​glScalef(1,​1,​1);'',​ ya que deja tal cual los polígonos, pero los puedes escalar a la mitad llamandola ''​glScalef(0.5,​0.5,​0.5);''​ o invertirla verticalmente ''​glScalef(1,​-1,​1);''​
 Para reiniciarla,​ es decir, antes de empezar a dibujar la escena (piena que esta matriz se "​deforma"​ al ir dibujando y colocando los elementos) llamaremos a ''​glLoadIdentity()''​ que carga la matriz identidad (la inicial). Por lo tanto, para mover dos figuras hacia distinto lugar, aunque generalmente se utiliza la pila de matrices también podemos, primero mover una con glTranslatef y  antes de mover la otra reiniciaremos la matriz con ''​glLoadIdentity();''​ y luego moveremos la otra.  Para reiniciarla,​ es decir, antes de empezar a dibujar la escena (piena que esta matriz se "​deforma"​ al ir dibujando y colocando los elementos) llamaremos a ''​glLoadIdentity()''​ que carga la matriz identidad (la inicial). Por lo tanto, para mover dos figuras hacia distinto lugar, aunque generalmente se utiliza la pila de matrices también podemos, primero mover una con glTranslatef y  antes de mover la otra reiniciaremos la matriz con ''​glLoadIdentity();''​ y luego moveremos la otra. 
  
Línea 341: Línea 341:
 <code cpp>​glOrtho (0, 3.0f, 0, 3.0f, 0, 3.0f);</​code>​ <code cpp>​glOrtho (0, 3.0f, 0, 3.0f, 0, 3.0f);</​code>​
 En este el centro de la vista estará en la esquina derecha de la parte de debajo de la ventana (Para OpenGL ese es el punto (0,0)). Sin haber ningún pixel de profundidad entre el usuario y la vista pero desde la vista al fondo de la ventana habrían 3. En este el centro de la vista estará en la esquina derecha de la parte de debajo de la ventana (Para OpenGL ese es el punto (0,0)). Sin haber ningún pixel de profundidad entre el usuario y la vista pero desde la vista al fondo de la ventana habrían 3.
 +
 +
 +
  
  
Línea 348: Línea 351:
 Esta proyección se consigue sustituyendo el ''​glOrtho''​ (proyección ortogonal) por ''​gluPerspective''​ (habiendo hecho el include a <​gl\glu.h>​). \\  Esta proyección se consigue sustituyendo el ''​glOrtho''​ (proyección ortogonal) por ''​gluPerspective''​ (habiendo hecho el include a <​gl\glu.h>​). \\ 
 ''​gluPerspective''​ tiene como parámetros:​ ''​gluPerspective''​ tiene como parámetros:​
-  * angulo visual vertical+  * angulo visual vertical, a más pequeño más será la relación cerca-grande de los objetos (si está muy bajo, sería como si mirases con unos primáticos).
   * GLfloat que representa la proporción de altura con anchura (ancho de la vista entre alto).   * GLfloat que representa la proporción de altura con anchura (ancho de la vista entre alto).
   * Comienzo de la vista   * Comienzo de la vista
Línea 359: Línea 362:
 gluPerspective(60.0,​ fAspect, 1.0, 500.0); ​ gluPerspective(60.0,​ fAspect, 1.0, 500.0); ​
 </​code>​ </​code>​
-Ver [[fw:​ogl:​xtra#​movimiento_de_camaras|relación con la cámara]]. +Ver [[fw:​ogl:​xtra#​movimiento_de_camaras|relación con la cámara]]. ​\\  
- +Cuando iniciamos el programa y lo configuramos en perspectiva,​ deberemos definir la cámara con ''​gluLookAt''​. Si la ventana donde estamos trabajando se reinicia deberemos volver a configurar la perspectiva. Aquí el código para reiniciar la vista: 
 +<code cpp> 
 +glMatrixMode(GL_PROJECTION);​ 
 +glLoadIdentity();​ 
 +gluPerspective(this->​angle,​ (float)w / (float)h, 0.1f, lengthView + 0.1f); 
 +glMatrixMode(GL_MODELVIEW);​ 
 +glLoadIdentity();​ 
 +gluLookAt(0.0f,​ 0.0, -0.2f, 0.0f, 0.0f, lengthView, 0.0f, 1.0f, 0.0f); 
 +</​code>​
  
 ===== Iluminación ===== ===== Iluminación =====
Línea 570: Línea 580:
  
 ===== Texturas ===== ===== Texturas =====
 +
 +
 +
  
  
Línea 637: Línea 650:
 Una vez tengamos las texturas definidas, ahora debemos de indicar las coordenadas que tendrá la textura. En un cuadrado estas coordenadas son: Una vez tengamos las texturas definidas, ahora debemos de indicar las coordenadas que tendrá la textura. En un cuadrado estas coordenadas son:
   * Parte alta izquierda: 0.0,1.0   * Parte alta izquierda: 0.0,1.0
-  * Parte alta derecha: 1.0, 1.0 
   * Parte baja izquierda: 0.0, 0.0   * Parte baja izquierda: 0.0, 0.0
-  * Parte baja derecha: 1.0, 0.0 \\ +  * Parte baja derecha: 1.0, 0.0  
 +  * Parte alta derecha: 1.0, 1.0
 Por lo tanto, si a estos valores damos parte alta izquierda (ai) 0.25 0.75, ad 0.75 0.75, bi 0.25 0.25, bd 0.75 0.25, veremos sólo el centro de la textura. \\  Por lo tanto, si a estos valores damos parte alta izquierda (ai) 0.25 0.75, ad 0.75 0.75, bi 0.25 0.25, bd 0.75 0.25, veremos sólo el centro de la textura. \\ 
 Para aplicar estas coordenadas usaremos la función ''​glTexCoord2f''​ de la siguiente forma: Para aplicar estas coordenadas usaremos la función ''​glTexCoord2f''​ de la siguiente forma:
Línea 657: Línea 670:
   * GL_TEXTURE_ENV_MODE   * GL_TEXTURE_ENV_MODE
   * Cómo afecta el color:   * Cómo afecta el color:
-    * GL_MODULATE,​ a color más claro en la textura más color que se deja ver del polígono.+    * GL_MODULATE,​ a color más claro en la textura más color que se deja ver del polígono. Si utilizamos texturas con alpha este flag será necesario.
     * GL_DECAL, hace que el color de la textura se sobreponga al del polígono (como GL_REPLACE)     * GL_DECAL, hace que el color de la textura se sobreponga al del polígono (como GL_REPLACE)
     * GL_BLEND, hace que los puntos blancos de la textura hagan que esa parte del polígono se transparente,​ los negros que se vea. Es decir, la textura actua como alfa sobre el polígono.     * GL_BLEND, hace que los puntos blancos de la textura hagan que esa parte del polígono se transparente,​ los negros que se vea. Es decir, la textura actua como alfa sobre el polígono.
 +
 +<code cpp>
 +glTexEnvi(GL_TEXTURE_ENV,​ GL_TEXTURE_ENV_MODE,​ GL_DECAL);
 +</​code>​
  
 === Uso de mipmaps === === Uso de mipmaps ===
Línea 818: Línea 835:
  
 ===== Efectos ===== ===== Efectos =====
 +
 +
 +
  
  
Línea 834: Línea 854:
 </​code>​ </​code>​
 Para que las transparencias surjan efecto GL_DEPTH_TEST y la iluminación,​ han de estar desactivadas. Para que las transparencias surjan efecto GL_DEPTH_TEST y la iluminación,​ han de estar desactivadas.
 +=== La ecuación de Blending ===
 +Para configurar el blending existen varias rutinas, entre ellas:
 +  * ''​glBlendFunc'',​ a la que se le pasan dos parámetros que representan la funciones de blending. GL_ZERO, GL_ONE, GL_SRC_COLOR,​ GL_ONE_MINUS_SRC_COLOR,​ GL_DST_COLOR,​ GL_ONE_MINUS_DST_COLOR,​ GL_SRC_ALPHA,​ GL_ONE_MINUS_SRC_ALPHA,​ GL_DST_ALPHA,​ GL_ONE_MINUS_DST_ALPHA,​ GL_CONSTANT_COLOR,​ GL_ONE_MINUS_CONSTANT_COLOR,​ GL_CONSTANT_ALPHA,​ GL_ONE_MINUS_CONSTANT_ALPHA,​ GL_SRC_ALPHA_SATURATE
 +  * ''​glBlendEquation''​ sólo se le pasa un parámetro, correspondiente a la ecuación de blending.
 +  * ''​glBlendFuncSeparate''​ como ''​glBlendFunc'',​ pero esta última al indicar las funciones estas se aplican a los valores RGBA por igual, con ''​glBlendFuncSeparate''​ se indican por separado.
 +  * ''​glBlendColor'',​ para indicar el color que OpenGL tomará por valor de alpha (por defecto el 0000).
 +
 +=== Alpha Testing ===
 +Utilizado para decir a OpenGL qué alpha será efectiva y cual no según el color, para que su uso sea efectivo deberemos activar ''​GL_ALPHA_TEST''​ (cuidado, a veces dará problemas con el blending). Y utilizaremos la función ''​glAlphaFunc''​ a la cual se le pasa el modo en que actuará y un valor entre 0.0 y 1.0. El modo puede ser:
 +  * GL_NEVER, el color nunca será transparaente.
 +  * GL_ALWAYS, el color siempre será transparente.
 +  * GL_LESS, el color será transparente si es menor al valor dado.
 +  * GL_LEQUAL, el color será transparente si es menor o igual al valor dado.
 +  * GL_EQUAL, el color será transparente si es igual al valor dado.
 +  * GL_GEQUAL, el color será transparente si es mayor o igual al valor dado.
 +  * GL_GREATER, el color será transparente si es mayor al valor dado.
 +  * GL_NOTEQUAL,​ el color será transparente si no es igual al valor dado.
  
 ==== Niebla ==== ==== Niebla ====
Línea 949: Línea 986:
 </​code>​ </​code>​
 Define el tamaño del buffer de estarcido. Define el tamaño del buffer de estarcido.
 +
  
  
Línea 964: Línea 1002:
   * Tenemos que tener en cuenta que los objetos a los que vaya a transparentar han de haber sido dibujados antes que el transparente.   * Tenemos que tener en cuenta que los objetos a los que vaya a transparentar han de haber sido dibujados antes que el transparente.
   * Sobre qué hacer al cerrar, liberar las propiedades definidas, o cambiar de ventana en OpenGL existe un [[fw:​ogl:​xtra#​fullscreen_y_cambio_de_resolucion|artículo que habla de ello]].   * Sobre qué hacer al cerrar, liberar las propiedades definidas, o cambiar de ventana en OpenGL existe un [[fw:​ogl:​xtra#​fullscreen_y_cambio_de_resolucion|artículo que habla de ello]].
 +  * En windows las texturas están enlazadas a la ventana, si la ventana es destruida o no se ha creado todavía, las texturas no se cargarán correctamente.
fw/ogl.1215518025.txt.gz · Última modificación: 2020/05/09 09:24 (editor externo)