깊이 큐 및 안개 명령을 포팅할 때 다음 사항에 유의하세요.
IRIS GL 호출인 fogvertex는 모드 및 해당 모드에 영향을 주는 매개 변수를 설정합니다. OpenGL에서는 glFog 를 한 번 호출하여 모드를 설정한 다음, 다시 두 번 이상 호출하여 다양한 매개 변수를 설정합니다.
OpenGL에서 깊이 큐는 별도의 기능이 아닙니다. 깊이 큐 대신 선형 안개를 사용합니다. (이 섹션에서는 이 작업을 수행하는 방법의 예를 제공합니다.) 다음 IRIS GL 함수에는 직접 OpenGL과 동등한 값이 없습니다.
depthcue
lRGBrange
lshaderange
getdcm
안개 품질을 조정하려면 glHint( GL_FOG_HINT )를 사용합니다.
다음 표에서는 안개 및 해당 OpenGL 함수를 관리하기 위한 IRIS GL 함수를 나열합니다.
IRIS GL 함수 | OpenGL 함수 | 의미 |
---|---|---|
fogvertex | glFog | 다양한 안개 매개 변수를 설정합니다. |
fogvertex( FG_ON ) | glEnable ( GL_FOG ) | 안개를 켭니다. |
fogvertex( FG_OFF ) | glDisable ( GL_FOG ) | 안개를 끕니다. |
depthcue | glFog ( GL_FOG_MOD, GL_LINEAR ) | 깊이 큐에 선형 안개를 사용합니다. |
다음 표에서는 glFog에 전달할 수 있는 매개 변수를 나열합니다.
안개 매개 변수 | 의미 | 기본값 |
---|---|---|
GL_FOG_DENSITY | 안개 밀도. | 1.0 |
GL_FOG_START | 선형 안개에 대한 가까운 거리입니다. | 0.0 |
GL_FOG_END | 선형 안개에 대한 먼 거리입니다. | 1.0 |
GL_FOG_INDEX | 안개 색 인덱스입니다. | 0.0 |
GL_FOG_COLOR | 안개 RGBA 색입니다. | (0, 0, 0, 0) |
GL_FOG_MODE | 안개 모드. | 다음 표를 참조하세요. |
OpenGL의 안개 밀도 매개 변수는 IRIS GL의 매개 변수와 다릅니다. 다음과 같이 관련됩니다.
fogMode = EXP2인 경우
openGLfogDensity = (irisGLfogDensity ) ( sqrt ( log ( 1/255 ) ))
if fogMode = EXP
openGLfogDensity = (irisGLfogDensity ) ( log ( 1 / 255 ) )
여기서 sqrt 는 제곱근 연산이고, 로그 는 자연 로그이고, irisGLfogDensity 는 IRIS GL 안개 밀도이고, openGLfogDensity 는 OpenGL 안개 밀도입니다.
픽셀당 모드와 꼭짓점별 모드에서 안개 계산 사이를 전환하려면 glHint(GL_FOG_HINT, hintMode)를 사용합니다. 다음 두 가지 힌트 모드를 사용할 수 있습니다.
- 픽셀당 안개 계산 GL_NICEST
- 꼭짓점별 안개 계산 GL_FASTEST
다음 표에는 IRIS GL 안개 모드 및 해당 OpenGL에 해당하는 항목이 나열되어 있습니다.
IRIS GL 안개 모드 | OpenGL 안개 모드 | 힌트 모드 | 의미 |
---|---|---|---|
FG_VTX_EXP,FG_PIX_EXP |
GL_EXP | GL_FASTEST,GL_NICEST |
짙은 안개 모드(기본값). |
FG_VTX_EXP2,FG_PIX_EXP2 |
GL_EXP2 | GL_FASTEST,GL_NICEST |
안개 모드입니다. |
FG_VTX_LIN,FG_PIX_LIN |
GL_LINEAR | GL_FASTEST,GL_NICEST |
선형 안개 모드입니다. (깊이 큐에 사용합니다.) |
다음 코드 예제에서는 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);
}