DX 9を使った3 Dゲームプログラミング入門-part.2 Direct 3 D基礎5章

4595 ワード

第五章照明
照明:シーンのリアリティを高め、立体的な輪郭や物体の体積を表現するのに役立ちます.照明を利用して、BUTEXの色を指定するのではなく、定義された照明と在日および表面の角度に基づいて、Direct 3 Dに照明エンジンを搭載してBUTEXの色を計算し、照明モデルに基づいて計算されたBUTEXの色によってより自然なシーンを表現します.
5.1照明要素
Direct 3 Dの照明モデルでは、光源から発生する光は、以下の3つの要素から構成されています.
*アンビエントライト-アンビエントライトは別の面に反射され、シーン全体を照らす光をモデリングします.例えば、物体の一部は光源の直接視野で遮られても光を受ける.これらの部分は別の表面で反射された光によって照射される.環境光はこのような比較的安価で簡単に反射光を実現する方法である.
*拡散反射光-拡散反射光は特定の方向に進み、表面に触れるとすべての方向の反射が同じになります.すべての方向で同じ反射であり、位置にかかわらず、観察者の位置を考慮する必要がなく、観察者の目に光が届く.すなわち,拡散反射光方程式は光の方向と表面の形状だけを考慮する必要がある.拡散反射光は、光源が発する最も一般的な光です.
*正反射-正反射は特定の方向に行われ、表面に触れると一方向に強く反射し、特定の角度からしか観察できません.光は一方向にのみ反射するので,正反射光の方程式では,光の方向と表面の形態,および観察者の視点を考慮しなければならない.正の反射光を用いて,シンチレーション表面での光の反射効果をモデリングした.
正反射光は他のタイプの光よりも多くの計算を必要とするため、Direct 3 Dは魅力的なオプションを提供しています.実際には、このオプションはパレットとしてオフになっています.反射光をアクティブにするには、D 3 DRS SPECURLARENABLEレンダリングステータスを設定する必要があります.
Device-> SetRenderState(D3DRS_SPECULARENABLE, true)
各李光の形は、光の色を表すD 3 DCOLORまたはD 3 DCOLORVALUE構造体として表すことができる.D 3 DXCOLORクラスのAlpha値は光の色を表すのに使用されません.
5.2材質
私たちが現実に見ている物体の色は、物体が反射する光の色によって決まる.
D 3 Dでは、物体のマテリアルを定義し、この現象をモデリングすることができ、マテリアルでは、物体の表面から反射する光の強度を指定することができます.コードは以下のD 3 DMATERIAL 9構造を用いて材質を表す.
typedef struct _D3DMATERIAL9 {
D3DCOLORVALUE Diffuse, Ambient, Specular, Emissive;
float Power;
}D3DMATERIAL9
Diffuse-表面で反射される拡散光の量を指定します.
Ambient-表面反射の環境観測量を指定します.
Spence-表面反射の正逆光量を指定します.
Emissive-この成分は、物体自体が発光するようにより明るい物体効果を生成するために、全体の表面の色を増加させるために使用される.
Power:反射光のシャープさを指定します.値が高いほど、ハイライトが表示されます.
たとえば、赤いボールがほしいとしたら、この例では、マテリアルを設定して赤い光を反射し、他のすべての光を吸収するだけでいいです.
各光の種類に応じて、反射する光の色を指定できます.
すべての光の吸収-黒
すべての光線の反射-白
D3DMATERIAL9 d3d::InitMtrl(D3DXCOLOR a, D3DXCOLOR d, D3DXCOLOR s, D3DXCOLOR e, float p)
初期化の代わりに関数を使用することもできます
BUTEX構造は、マテリアル属性を持たず、現在のマテリアルを指定するIDirect 3 Ddevice 9:Set Material(CONST D 3 DMATERIAL 9*pMaterial)メソッドを使用します.
たとえば、異なるマテリアルを使用している複数のオブジェクトをレンダリングする場合は、次のコード構造を使用します.
D3DMATERIAL blueMaterial, redMaterial;
...//マテリアル構造体の構成
Device->SetMaterial(&blueMaterial);
drawSphere();
Device->SetMaterial(&redMaterial);
drawSphere();
5.3 Vertex法線
面法線は、ポリゴンが望む方向を表すベクトルです.
Buttex法線:基本的には同じ考えに基づいていますが、それぞれのポリドラゴンの法線ではなく、ポリドラゴンを構成するバーグの法線を定義します.
D 3 Dは、光軸単位で光の角度を算出するので、光軸角度(法線)が必要となる.
注意BUTEX法線と面法線は同じではありません.
BurtexのBurtex法線をマークするには、Burtex構造体を更新する必要があります.
struct Vertex
{
float _x,_y, _z;
flaot _nx,_ny,_nz;
static const DWORD FVF;
}
const DWORD Vertex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL;
カラーメンバーの削除->ライトを使用したBUTEXカラーの計算
次の関数は、三角形のセイバーテクスチャポイントの面向量を計算します.この関数は、Burtexが時計回りに回転する順序を使用すると仮定します.法線の方向が逆でなければ.
void ComputeNormal(D3DXVECTOR3 p0,D3DXVECTOR3 p1,D3DXVECTOR3 p2,D3DXVECTOR3 out)
{
D3DXVECTOR3 u = p1 - p0;
D3DXVECTOR3 v = p2 - p0;
d3dvec3cross(out,&u,&v);
d3dvec3Normalize(out,out);
}
Vertex法線として面法線を使用している場合は、スムーズではありません->法線の平均化を行います.
BUTEX法線を見つけるには,まず共有BUTEX vのメッシュにおいてすべての三角形の面法線を見つけ,次にすべての面法線の平均値を求める.
変化段階でBUTEX法線が歪む現象が発生する可能性があるため、D 3 DRS NORMALIZONEORMALSレンダリング状態をアクティブにし、Direct 3 Dが変化段階後にすべての法線を再整理するのは安全です.
Device->SetRenderState(D3DRS_NORMALIZENORMALS,true);
5.4光源
D 3 Dは3種類の光源をサポートする.
*点光源-点光源は世界空間内にあり、すべての方向に発光します.
*指向性光源-指向性光源は位置を持たないが、指定された方向と平行に発光する.
  • ポート光源-ポート光源は懐中電灯光源と似ています.光源は位置を持ち、特定の方向に円錐状の光を放出します.円錐の特性はパイと3ダースの2つの角度によって決まる.3ショット目は内側打者が外側typedef struct D 3 D 1 IGHT 9
    D3D1IGHTTYPE Type ;//光源のタイプを指定
    D3DC010RVA1UE Diffuse;//光源からの拡散反射光の色
    D3DC010RVA1UE Specular;//光源が発する正反射の色
    D3DC010RVA1UE Ambient ;//光源が発する周囲光の色
    D3DVECTOR Position;//光源の位置のベクトルを定義します.方向性はxを意味する
    D3DVECTOR Direction;//光の方向を定義します.点光源表示x
    float Range ;//光が完全に消えるまで最大距離で行うことができます.この値は「ルート」(FLT MAX)より大きくなく、指向性光源には意味がありません.
    float Falloff;//この値はスポットライトの下でのみ使用され、内側テーパと外側テーパの間の光の強さの差を定義します.
    float AttenuationO.;
    float Attenuationl;
    float Attenuation2;
    //減衰変数は、点光源と集光光源でのみ使用される距離に伴う光強度の減衰度合いを定義します.0は定数の減少を表し、1は線形の減少を表し、2は光源からの距離がDであることを表し、以下の式を確立することができる.

    float Theta;//スポットライトのフィレット角度
    float Phi;//スポットライトのフィレット角度
    } D3DLIGHT9;
  • D 3 DLIGHT 9インスタンスを初期化すると、D 3 D管理の内部リストに登録する必要があります.
    Device->SetLight(
    0/光源リストの要素を指定するには、0-最大光源の範囲を指定します.
    &light//設定するD 3 DLIGHT構造体のアドレス
    );
    光源を登録すると、次のコードを使用して光源をオンまたはオフにできます.
    Device->LightEnable(
    0,//アクティブ/無効にするライトリストの要素
    true//trueがアクティブ
    );
    サマリ
    *D 3 Dは方向性、点、ポート光源を提供し、光源は環境光、拡散反射光、正反射光の3種類の光を発する.
    *表面のマテリアルは、表面と接触する光の相互作用を定義します.
    △反射または吸収される光の量を調整することによって、表面の色を決定する.
    *BUTEX法線はBUTEXの方向を定義し、D 3 DはBUTEX法線を使用して光がBUTEXに到達する角度を計算します.