##### Kamui2 Library - グローバル設定関数

# kmGenerateFogTable

フォグテーブルの自動生成

### 書式

> `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() | フォグテーブルの設定

kmGenerateFogTable

COPYRIGHT © NEC Corporation / © SEGA ENTERPRISES, LTD., 1998-2000