トップページ
ひらく | たたむ | ページトップ
↓マウスで反転選択した文字を検索
OpenGL
   
ページ内検索 ページ外検索
検索したい文字を入力して
ENTERを押すと移動します。
\n
[ トップページ ]
[ ____CommandPrompt ] [ ____JScript ] [ ____MySQL ] [ ____Cygwin ] [ ____Java ] [ ____Emacs ] [ ____Make ] [ ____Perl ] [ ____Python ] [ ____OpenGL ] [ ____C# ] [ ____StyleSheet ] [ ____C++ ] [ ____Winsock ] [ ____Thread ] [ ____VisualStudio ] [ ____C ] [ ____Win32API ] [ ____Lua ] [ ____PhotoShop ]
ヘッダ検索
___

■ ブレンディング(Blending)


  SAMPLE
     加算ブレンド 
     ブレンドを利用した残像エフェクト 


  DESC
    ブレンディングを指定することで、フレームバッファとフラグメントの色を混色できる。
    半透明のオブジェクトを描画したり、特殊なエフェクトを追加できる。

  POINT
    半透明を描画するときは, Blend ステートを設定すること。


    ブレンド処理はフラグメントの色が決定した後にフレームバッファにある色とされる。
      頂点処理 ---> フラグメント処理 ---> ブレンド処理 ---> ピクセルの色が決定
ブレンド方法は1次式の内容を指定するだけ。
    合成色 = Fragment * sFactor  +  FrameBuffer * dFactor
NOTE 係数は [0:1] の範囲であることが前提 合成結果 は [0:1] にクランプされる アルファ成分も計算される POINT ブレンド係数の指定は複数あるが、意味のある組み合わせは以下のような内容。
    // アルファブレンド
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    // 加算
    glBlendFunc(GL_SRC_ALPHA, GL_ONE);
    // 上書き ( デフォルト )
    glBlendFunc(GL_ONE, GL_ZERO);

    // 光学フィルター
    //    色成分 の割合を調整する
    //
    glBlendFunc( GL_ZERO, GL_SRC_COLOR );
___

■ ブレンド処理による残像

前のフレームの画像と現在のフレームの描画結果を混色することで残像のような効果をだせる。 前のフレームの結果をテクスチャに保持しておき、現在のフレームとアルファブレンドする。

    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );


    // シーンを描画する。この時点でフレームバッファは現在のフレームの結果になる。
    setProjection( 60/1, 1.0f*W/(float)H, 1, 1000 );
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
    convertCameraSpace();
    drawCube();


    // テクスチャとして、とっておいた前のフレームとブレンドする。

    // 前のフレームをバインド
    glBindTexture( GL_TEXTURE_2D, id );

    // ブレンド指定    
    glEnable( GL_BLEND );
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    // 画面いっぱいに矩形を描くための変換
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
    glDisable( GL_DEPTH_TEST );

    // 頂点カラーのアルファ成分を使って、フラグメントのアルファを指定する。
    glColor4f( 1, 1, 1, 0.99f )
    {
      glBegin( GL_QUADS );
      float s = 1;
      float z = -1;
      glTexCoord2f( 0, 0 );      glVertex3f( -s, -s, z );
      glTexCoord2f( 1, 0 );      glVertex3f(  s, -s, z );
      glTexCoord2f( 1, 1 );      glVertex3f(  s,  s, z );
      glTexCoord2f( 0, 1 );      glVertex3f( -s,  s, z );
      glEnd();
    }

    // 合成結果を次のフレームに使うため、とっておく。
    glBindTexture( GL_TEXTURE_2D, id );
    glCopyTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, W, H, 0 );

___

■ glBlendFunc

SYNTAX void glBlendFunc( GLenum s, // フラグメントの重み GLenum d // フレームバッファの重み ); DESC 合成するときのブレンド率を指定する。 DEFAULT GL_ONE GL_ZERO
___

■ glBlendEquation

SYNTAX void glBlendEquation( unsigned int ) DESC Fragment, FrameBuffer の合成方法( 計算式 )を指定する DEFAULT GL_FUNC_ADD
    // 加算
    //   S + D
    glBlendEquation( GL_FUNC_ADD );

    // 減算
    //   S - D
    glBlendEquation( GL_FUNC_SUBSTRACT );

    // 減算
    //   D - S
    glBlendEquation( GL_FUNC_REVERSE_SUBSTRACT );

    // min, max
    //    min( S, D )
    //    max( S, D )
    glBlendEquation( GL_MIN );
    glBlendEquation( GL_MAX );


POINT Alpha 成分の指定もすることになる


    GL_ZERO
        RGB          A
        ( 0, 0, 0 )  0

    GL_ONE
        RGB          A
        ( 1, 1, 1 )  1

    GL_SRC_ALPHA
        RGB             A
        ( As, As, As )  As

    GL_SRC_COLOR
        RGB             A
        ( Rs, Gs, Bs )  As

sfactor specifies which of nine methods is used to scale the source color components. dfactor specifies which of eight methods is used to scale the destination color components. The eleven possible methods are described in the following table. Each method defines four scale factors, one each for red, green, blue, and alpha. In the table and in subsequent equations, source and destination color components are referred to as ( Rs, Gs, Bs, As ) and ( Rd, Gd, Bd, Ad ). They are understood to have integer values between 0 and ( kR, kG, kB, kA ), where kc = 2mc - 1 TIP 半透明の面を正しく描画するにはアプリケーションは次の順番で描画をする。 1. 不透明な面をかく 2. 半透明を 視点から遠い順にかく

    // 不透明 Object を描画
    drawOpaqueObject();


    // depth かきこみ OFF
     glDepthMask( GL_FALSE );


    // ブレンド機能を有効にする。
      glEnable( GL_BLEND );


    // ブレンド方法を指定する。
      glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );


    // Fragment の Alpha を透明にする
    // 画面奥から順番に描画
    //
    // Alpha を 1 以下に
    //  Texture のアルファ値も乗算されるはず
    float a = 0.5f;
    float s = 100.0f;
    glColor4f( 1, 1, 1, a );
    glBegin( GL_QUADS );
    glVertex4f( 0, 0, z, 1 );
    glVertex4f( s, 0, z, 1 );
    glVertex4f( s, s, z, 1 );
    glVertex4f( 0, s, z, 1 );
    glEnd();

    SRC = fragment col, DST = buf col

    // blend 処理 ON
    glEnable( GL_BLEND );

    // blend の計算式を選ぶ
    glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

    // 加算する場合
    glBlendFunc(GL_SRC_ALPHA, GL_ONE);

___

■ アルファテスト

DESC 指定した条件に合格したフラグメントのみがフレームバッファへ更新される。 適用する、しないの2値の処理のため、ブレンド処理の方が柔軟に制御できる。
    glEnable( GL_ALPHA_TEST );

    // > 0.1 なら合格
    glAlphaFunc( GL_GREATER, 0.1f ); 







金利比較.COM
NINJAIDX 9