다음을 통해 공유


포팅 깊이 큐 및 안개 명령

깊이 큐 및 안개 명령을 포팅할 때 다음 사항에 유의하세요.

  • 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); 
}