Indicação de profundidade de portabilidade e comandos de neblina
Ao portar comandos de sinalização de profundidade e neblina, lembre-se dos seguintes pontos:
A chamada GL do IRIS, fogvertex, define um modo e os parâmetros que afetam esse modo. No OpenGL, você chama glFog uma vez para definir o modo e, em seguida, novamente duas ou mais para definir vários parâmetros.
No OpenGL, a indicação de profundidade não é um recurso separado. Use neblina linear em vez de indicação de profundidade. (Esta seção fornece um exemplo de como fazer isso.) As seguintes funções IRIS GL não têm equivalente openGL direto:
depthcue
lRGBrange
lshaderange
getdcm
Para ajustar a qualidade da neblina, use glHint( GL_FOG_HINT ).
A tabela a seguir lista as funções IRIS GL para gerenciar a neblina e suas funções OpenGL equivalentes.
Função IRIS GL | Função OpenGL | Significado |
---|---|---|
fogvertex | glFog | Define vários parâmetros de neblina. |
fogvertex( FG_ON ) | glEnable ( GL_FOG ) | Liga a neblina. |
fogvertex( FG_OFF ) | glDisable ( GL_FOG ) | Desliga a neblina. |
depthcue | glFog ( GL_FOG_MOD, GL_LINEAR ) | Usa neblina linear para indicação de profundidade. |
A tabela a seguir lista os parâmetros que você pode passar para glFog.
Parâmetro de neblina | Significado | Padrão |
---|---|---|
GL_FOG_DENSITY | Densidade de neblina. | 1,0 |
GL_FOG_START | Distância próxima para neblina linear. | 0.0 |
GL_FOG_END | Distância distante para neblina linear. | 1,0 |
GL_FOG_INDEX | Índice de cor de neblina. | 0.0 |
GL_FOG_COLOR | Cor RGBA de neblina. | (0, 0, 0, 0) |
GL_FOG_MODE | Modo de neblina. | Confira a tabela a seguir. |
O parâmetro de densidade de neblina do OpenGL difere do do IRIS GL. Eles estão relacionados da seguinte maneira:
if fogMode = EXP2
openGLfogDensity = (irisGLfogDensity ) ( sqrt ( log ( 1 / 255 ) ))
if fogMode = EXP
openGLfogDensity = (irisGLfogDensity ) ( log ( 1 / 255 ) )
onde sqrt é a operação raiz quadrada, log é o logaritmo natural, irisGLfogDensity é a densidade de neblina IRIS GL e openGLfogDensity é a densidade de neblina OpenGL.
Para alternar entre o cálculo da neblina no modo por pixel e o modo por vértice, use glHint( GL_FOG_HINT, hintMode). Dois modos de dica estão disponíveis:
- GL_NICEST cálculo de neblina por pixel
- GL_FASTEST cálculo de neblina por vértice
A tabela a seguir lista os modos de neblina IRIS GL e seus equivalentes OpenGL.
Modo de neblina IRIS GL | Modo de neblina OpenGL | Modo de dica | Significado |
---|---|---|---|
FG_VTX_EXP,FG_PIX_EXP |
GL_EXP | GL_FASTEST,GL_NICEST |
Modo de neblina pesada (padrão). |
FG_VTX_EXP2,FG_PIX_EXP2 |
GL_EXP2 | GL_FASTEST,GL_NICEST |
Modo de neblina. |
FG_VTX_LIN,FG_PIX_LIN |
GL_LINEAR | GL_FASTEST,GL_NICEST |
Modo de neblina linear. (Use para indicação de profundidade.) |
O exemplo de código a seguir demonstra a indicação de profundidade no OpenGL:
/*
* depthcue.c
* This program draws a wire frame model, which uses
* intensity (brightness) to give clues to distance
* Fog is used to achieve this effect
*/
#include <GL/gl.h>
#include <GL/glu.h>
#include "aux.h"
/* Initialize linear fog for depth cueing
*/
void myinit(void)
{
GLfloat fogColor[4] = {0.0, 0.0, 0.0, 1.0};
glEnable(GL_FOG);
glFogi (GL_FOG_MODE, GL_LINEAR);
glHint (GL_FOG_HINT, GL_NICEST); /* per pixel */
glFogf (GL_FOG_START, 3.0);
glFogf (GL_FOG_END, 5.0);
glFogfv (GL_FOG_COLOR, fogColor);
glClearColor(0.0, 0.0, 0.0, 1.0);
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_FLAT);
}
/* display() draws an icosahedron
*/
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f (1.0, 1.0, 1.0);
auxWireIcosahedron(1.0);
glFlush();
}
void myReshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective (45.0, (GLfloat) w/(GLfloat) h, 3.0, 5.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity ();
glTranslatef (0.0, 0.0, -4.0); /*move object into view*/
}
/* Main Loop
*/
int main(int argc, char** argv)
{
auxInitDisplayMode (AUX_SINGLE | AUX_RGBA | AUX_DEPTH);
auxInitPosition (0, 0, 400, 400);
auxInitWindow (argv[0]);
myinit();
auxReshapeFunc (myReshape);
auxMainLoop(display);
}