次の方法で共有


Porting Depth Cueing コマンドと Fog コマンド

深度キューコマンドと霧コマンドを移植する場合は、次の点に注意してください。

  • IRIS GL 呼び出し である fogvertex は、モードとそのモードに影響するパラメーターを設定します。 OpenGL では、 glFog を 1 回呼び出してモードを設定し、もう一度 2 回以上呼び出してさまざまなパラメーターを設定します。

  • OpenGL では、深度キューは個別の機能ではありません。 深度キューの代わりに線形霧を使用します。 (このセクションでは、これを行う方法の例を示します)。次の IRIS GL 関数には、直接の OpenGL と同等の機能はありません。

    depthcue

    lRGBrange

    lshaderange

    getdcm

  • 霧の品質を調整するには、 glHint( GL_FOG_HINT ) を使用します。

次の表に、霧を管理するための IRIS GL 関数と、それに相当する OpenGL 関数を示します。

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 に渡すことができるパラメーターの一覧を示します。

Fog パラメーター 説明 Default
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 の霧密度パラメーターとは異なります。 これらは次のように関連しています。

  • if fogMode = EXP2

    openGLfogDensity = (irisGLfogDensity ) ( sqrt ( log ( 1 / 255 ) ))

  • if fogMode = EXP

    openGLfogDensity = (irisGLfogDensity ) ( log ( 1 / 255 ) )

sqrt は平方根演算、log は自然対数、irisGLfogDensity は IRIS GL 霧密度、openGLfogDensity は OpenGL 霧密度です。

ピクセル単位モードと頂点単位モードで霧の計算を切り替えるには、 glHint( GL_FOG_HINT, hintMode) を使用します。 次の 2 つのヒント モードを使用できます。

  • ピクセル単位の霧の計算を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); 
}