KMSTATUS kmGenerateFogTable( pFogTable, fFrontBorder, fBackBorder, fFogDensity, fHWFogDensity, dwFogType )
PKMFLOAT pFogTable
KMFLOAT fFrontBorder
KMFLOAT fBackBorder
KMFLOAT fFogDensity
KMFLOAT *fHWFogDensity
KMDWORD dwFogType
pFogTable (出力)生成したフォグテーブルを格納する配列へのポインタ fFrontBorder (入力)フォグが有効となる区間の前縁奥行き値 fBackBorder (入力)フォグが有効となる区間の後縁奥行き値 fFogDensity (入力)フォグの濃度 fHWFogDensity (出力)フォグ係数 dwFogType (入力)フォグテーブルのタイプ
KMSTATUS_SUCCESS 成功 KMSTATUS_OUT_OF_RANGE fBackBorderが0.0f以下、または fBackBorder > fFrontBorder、または fFogDensityが0.0fより小さい
フォグテーブルを自動生成します。引数 pFogTableは、生成したフォグテーブルを格納するための 128エントリの KMFLOAT形式の一次元配列へのポインタです。 各要素の内容は、0.0fから1.0fの範囲にクリッピングされます。 この関数がエラーを返した場合もそれなりのフォグテーブルが生成されますが、ユーザーの意図したものとは異なる効果となるでしょう。 pFogTableにNULLを指定した場合には、生成したフォグテーブルとfHWFogDensityを直ちにハードウェアに設定します。
引数 fFrontBorderは、フォグが有効となる区間の前縁奥行き値を指定します。この値は0.0fより大きく、またfBackBorder以上でなければなりません。
引数 fBackBorderは、フォグが有効となる区間の後縁奥行き値を指定します。この値は0.0fより大きくかつ fFrontBorder以下でなければなりません。
引数 fFogDensityは、フォグの濃度を指定します。 0.0f以上の浮動小数で指定します。
この値は、引数 dwFogTypeで指定するフォグのタイプにより、下記のように意味が変化します。
定義 意味 KM_FOGTYPE_NONE この値は意味を持ちません。 KM_FOGTYPE_LINEAR 生成されたフォグテーブルの各要素に、この値が乗算されます。フォグの濃度を制御することができます。 0.0fから1.0fまでの値を指定することができます。 KM_FOGTYPE_EXPONENTIAL フォグテーブルの濃度傾斜を変化させることができます。値が大きいほど、傾斜は急峻になります。 0.0f以上の浮動小数で指定します。 KM_FOGTYPE_EXPONENTIAL2 フォグテーブルの濃度傾斜を変化させることができます。値が大きいほど、傾斜は急峻になります。 0.0f以上の浮動小数で指定します。
引数fHWFogDensityの指し示すポインタには、 kmSetFogDensity()関数でPowerVRハードウェアに設定するフォグ係数を浮動小数で返します。 この値は kmConvertFogDensity()関数によってWORD値に変換した上で、kmSetFogDensity()関数を使用してハードウェアに設定してください。
引数 dwFogTypeには、フォグテーブルのタイプを指定します。 指定するタイプによって、生成されるフォグテーブルの濃度傾斜が異なります。
以下の中のいずれかを指定することができます。
定義 意味 KM_FOGTYPE_NONE フォグなし/フォグテーブルの全エントリはゼロ KM_FOGTYPE_LINEAR リニアフォグ/奥行き値fFrontBorderからfBackBorderまで線形に変化するフォグテーブル KM_FOGTYPE_EXPONENTIAL 指数フォグ/ Direct3Dのexponentialフォグモードに相当 KM_FOGTYPE_EXPONENTIAL2 指数フォグ/ Direct3Dのexponential squaredフォグモードに相当
フォグが有効となる区間の前縁および後縁の奥行き値を与えると、その区間になだらかなフォグがかかるようなフォグテーブルとフォグ係数を生成します。 フォグテーブルは、その最初のエントリが区間の後縁値(fBackBorder)のフォグ濃度を表すように生成されます(下図参照)。
同時に生成されるフォグ係数(*fHWFogDensity)を、 kmConvertFogDensity()関数と kmSetFogDensity()関数を使用してハードウェアに設定することにより、生成されたフォグテーブルの先頭エントリが区間の後縁値(fBackBorder)から参照されるようにできます。 この場合、フォグテーブルの最後尾(前縁)の内容は、奥行き値 = 248 × fBackBorder の位置のフォグ濃度を示すことになります。 すなわち、この関数で生成されるフォグテーブルの有効範囲は、奥行き値 = fBackBorder(後縁)から 248 × fBackBorder(前縁)までの範囲となります(ハードウェア仕様)。 fBackBorderの値の指定によっては、必ずしも指定したfFrontBorderまでの区間を完全にカバーできないことにご注意ください。
生成するフォグテーブルのタイプとして、濃度傾斜が異なる下記4種の中からいずれかを選択することができます。
■KM_FOGTYPE_NONE
フォグなしを指定します。フォグテーブルの全エントリにはゼロがセットされます。
■KM_FOGTYPE_LINEAR
リニアフォグを設定します。奥行き値fFrontBorderからfBackBorderまで、線形に変化するフォグテーブルを生成します。 fFogDensityが1.0の場合、フォグ濃度はfBackBorderの位置で1.0(最大濃度)、 fFrontBorderの位置で0.0(フォグなし)となります(下図赤色曲線)。 fFogDensityを1.0fから0.0fまでの範囲で変化させることにより、フォグ濃度の傾斜を変化させることができます。
■KM_FOGTYPE_EXPONENTIAL
指数フォグを設定します。 ある奥行き値Zに於けるフォグ濃度は、下記の式で決定されます。
フォグ濃度 = e ^ −( fFogDensity × Z )(eは自然対数の底、^はべき乗)
Direct3Dのexponentialフォグモードに相当します。 fFogDensityが1.0の場合は、Z値が1.0のときにフォグ濃度が0.367879...となるような指数グラフになります(下図赤色曲線)。 また、Z値がfBackBorderより小さい(奥の)区間については、fBackBorderの位置に於ける 値が維持されます。逆にZ値がfFrontBorderより大きい(手前の)区間については、フォグ濃度はゼロとなります。 fFogDensityはゼロ以上であればどのような値でも指定できます。 fFogDensityがゼロの場合は、フォグ濃度の傾斜はフラット(常に最大濃度)となり、 fFogDensityが大きいほど、フォグ濃度の傾斜は急峻になります。
■KM_FOGTYPE_EXPONENTIAL2
指数フォグを設定します。 フォグ濃度の傾斜はKM_FOGTYPE_EXPONENTIALの場合より急峻になります。 ある奥行き値Zに於けるフォグ濃度は、下記の式で決定されます。
フォグ濃度 = ( e ^ −( fFogDensity × Z )) ^ 2 (eは自然対数の底、^はべき乗計算を示します。)
Direct3Dのexponential squaredフォグモードに相当します。 fFogDensityが1.0の場合は、Z値が1.0のときにフォグ濃度が0.135335...となるような指数グラフになります。(下図赤色曲線)。 また、Z値がfBackBorderより小さい(奥の)区間については、fBackBorderの位置に於ける値が維持されます。 逆にZ値がfFrontBorderより大きい(手前の)区間については、フォグ濃度はゼロとなります。 fFogDensityはゼロ以上であればどのような値でも指定できます。 fFogDensityがゼロの場合は、フォグ濃度の傾斜はフラット(常に最大濃度)となり、 fFogDensityが大きいほど、フォグ濃度の傾斜は急峻になります。
フォグテーブルを自動生成させるには、下記の関数を使用します。
関数 内容 kmGenerateFogTable() フォグテーブルの生成 kmConvertFogDensity() フォグ係数の変換 kmSetFogDensity() フォグ係数の設定 kmSetFogTableColor() フォグの色の設定 kmSetFogTable() フォグテーブルの設定
kmConvertFogDensity() フォグ係数の変換 kmSetFogDensity() テーブルフォグの係数指定 kmSetFogTableColor() テーブルフォグカラーの指定 kmSetFogTable() フォグテーブルの設定