メルマガ:あゆしゃのC言語プログラミング
タイトル:あゆしゃのC言語プログラミング(Vol.623) DX9 光源の設定  2005/12/14


/*========================================================*/
    <<<あゆしゃのC言語プログラミング>>>
/*========================================================*/
 第623回 DX9 光源の設定
 発行    2005年12月14日(水曜日)
 発行数   約2500

{magclick}
/*========================================================*/
 はじめに ( 決り文句 )
/*========================================================*/
・このメールマガジンは、主にまぐまぐさんから発行しています。
・ジャンルは、マルチメディアのプログラム、C言語です。
・横60文字で作成し、インデントは大抵半角スペース4つです。
・ここで扱うプログラムは、C言語と半光年以内のものです。
・登録解除は、メルマガのホームページでお願いします。
・過去ログはバックナンバー(下欄参照)を活用して下さい。
・内容は私が感じたもので、最新の技術も、へたれもあります。
・わかりやすさを優先させる為、たまに嘘があるかもしれません。

/*========================================================*/
 ご挨拶
/*========================================================*/

 こんにちは。あゆしゃです。

 雪です。

 愛知県はもう、雪のニュースでてんこ盛りです。

 寒くて寒くて、バイハザもままならない状況です。

 しばらく進めていて気が付いたのですが、このバイハザの主人公
はひょっとして、バイハザ2の時の主人公でしょうか?

★その節は大変お世話になりました。

 死ぬほどやりましたからね、ちょうど私がホームページを作り
はじめたぐらいのときでした。懐かしいです。

{magclick}
/*========================================================*/
 今回のお題  << DX9 光源の設定 >>
/*========================================================*/

 サンプルソースです。

http://ayusya.hp.infoseek.co.jp/Source/DX9Sample_051205.cpp

 その実行結果です。

http://ayusya.hp.infoseek.co.jp/Image/DirectXSample_051205.png

/*========================================================*/

 今回はプロジェクションの次の、光源の設定です。

// 光源の設定
D3DLIGHT9 light;
ZeroMemory( &light, sizeof( D3DLIGHT9 ) );
light.Type = D3DLIGHT_DIRECTIONAL;
DLM_SET_RGB( light.Diffuse, 0.8f, 0.8f, 1.0f ); // 自然光
D3DXVec3Normalize(
    ( D3DXVECTOR3* )&light.Direction,
    &D3DXVECTOR3( -1, -5, -1 ) ); // Direction計算
pDev->SetLight( 0, &light );
pDev->LightEnable( 0, TRUE );
pDev->SetRenderState( D3DRS_LIGHTING, TRUE );

 こんな感じですね。

/*========================================================*/

 最終的にデバイスに SetLight で登録します。

 光源はいくつも設定できます。

 第1引き数は光源の番号です。最初は0にしましょう。

 データは、D3DLIGHT9 構造体に設定します。

 まずはZeroMemoryで0クリアします。

 ZeroMemoryは、数値は0に、実数値は0.0に初期化します。

 実数値を含むデータなので、memset ではなくZeroMemoryを
使用します。

 そして、3つの項目を設定します。

/*========================================================*/

light.Type = D3DLIGHT_DIRECTIONAL;

 これは、光源が絶対光であることを指定しています。

 つまり、太陽の光のように、方向はあるが位置がなく(遠く)、
ある方向から均一に降り注ぐ光です。

 他に、ポイントとスポットライトがあります。

 ポイントはあるポイントを照らす光です。

 たいまつの明かりのようなものですね。

 スポットライトはその名前のとおり、スポットライトのように
円錐形の光を作り出します。

/*========================================================*/

DLM_SET_RGB( light.Diffuse, 0.8f, 0.8f, 1.0f ); // 自然光

 DLM_SET_RGB は事前に定義してあるマクロで、

#define DLM_SET_RGB( data, dr, dg, db ); \
    (data).r = dr; \
    (data).g = dg; \
    (data).b = db;

 という処理を代行します。
 1行1行書くのが面倒だったので。

 この設定は、この光源の色を指定しています。

/*========================================================*/

D3DXVec3Normalize(
    ( D3DXVECTOR3* )&light.Direction,
    &D3DXVECTOR3( -1, -5, -1 ) ); // Direction計算

 この設定は、光源の方向を指定しています。

 D3DXVec3Normalize を使用して設定します。

 設定される値は訳がわからない単位をしています。ありがたく、
関数を使いましょう。

 本当は、D3DXVec3Normalize の第2引き数には、角度を行列変換
して求めたベクトルを用意するのですが、ここでは適当な値を放り
込んでいるだけです。

/*========================================================*/

 デバイスに登録した光源は、有効にしないと働きません。

pDev->LightEnable( 0, TRUE );

 光源番号とTRUEかFALSEを指定します。

/*========================================================*/

 また、デバイス全体として、光源を有効にしないと動きません。

pDev->SetRenderState( D3DRS_LIGHTING, TRUE );

 もっとも、デフォルトで有効になっているので、この指定は
いらないのですが。

 FALSEを指定すると、光源どころか、すべての色の処理が省略
されて、原稿用紙のように真っ白になります。

{magclick}
/*========================================================*/
 さいごに
/*========================================================*/

 今後の予定です。

12月16日金曜日 第624回 DX10 マテリアルの設定
12月19日月曜日 第625回 DX11 メッシュの設定
12月21日水曜日 第626回 DX12 描画処理
12月23日金曜日 第627回 2005年総集編
 1月 9日月曜日 第628回 2006年
 1月11日水曜日 第629回 DX13 マップを描画

{magclick}
/*========================================================*/
 次回予告
/*========================================================*/

 次回は12月19日(月曜日)に、第625回をお送りします。
 お題は「DX10 マテリアルの設定」

 マテリアではありません。

 お楽しみに!

/*========================================================*/
 最後の決り文句
/*========================================================*/
 このメールマガジンは、まぐまぐさんから発行しています。
 このメールマガジンを解除したい場合は、まぐまぐさんをご利用
ください。このメルマガのまぐまぐアイディーは最後にあります。
 このメールマガジンには広告が挿入されていますか?
 このメールマガジンの内容に文面の引用はありませんか?
 めーらっくすの場合はめーらっくすの利用方に従ってください。
 このメールマガジンの内容の、転用、流用、宣伝、リンク、
ちょっとした雪で電車止まるし なんて大歓迎です。

{magclick}
/*========================================================*/
 
/*========================================================*/

発行者 あゆしゃ

ホームページ::あゆしゃの世界
http://ayusya.hp.infoseek.co.jp/

ご意見・ご感想・ご質問メール
mailto:ayusya@flamenco.plala.or.jp

まぐまぐ::アイディー
0000020674

まぐまぐ::登録と解除
http://www.mag2.com/m/0000020674.htm

まぐまぐ::バックナンバー
http://jazz.tegami.com/backnumber/frame.cgi?id=0000020674

めーらっくす::アイディー
MM3E1AEE285AB4F

めーらっくす::登録と解除
http://www.mailux.com/mm_dsp.php?mm_id=MM3E1AEE285AB4F

めーらっくす::バックナンバー★最近のものならこちらが便利★
http://www.mailux.com/mm_bno_list.php?mm_id=MM3E1AEE285AB4F

ブラウザの閉じるボタンで閉じてください。