フォト

Google AdSense

  • AdSense
無料ブログはココログ

« しまったな | トップページ | 動機 »

2005.01.24

3DCGの仕組みとシェーダプログラミングを同時に教える

これは個人的な課題というか、こういう方針の記事をShader.jpのArticleでやってみたいんですが、なかなかいい方法が思い浮かびません。

一つ、考えている説明が下記(Direct3D + HLSLの場合)ですが、どうでしょう?

・射影(このトピック名で妥当かは本人も疑問ですけど)
Direct3Dではビューポート(スクリーンって言った方が分かりやすい?)の範囲は内部的には下記のように扱われる。

X -1.0~1.0
Y 1.0~-1.0

頂点座標Vは以下のような計算で3D変換される。

V" = V*(ワールド行列*ビュー行列*プロジェクション行列)

この計算後のV"(シングルクォートが見づらいだけなんで"なのは気にしないでください)のw成分でxyz成分を割って出てきたxyがスクリーン座標(ビューポート)上の値になるわけですね。ちなみにzは前後によって色を塗るか塗らないか決めるZバッファに使うのと,一般的にDirect3Dの場合、0未満の場合は視点から後ろに存在し,1.0以上は遠すぎて描画しない物体とみなす(あくまで一般的な話で実際には0.5以上は描画しないみたいに値は変えられます。OpenGLの場合、0.0~-1.0の範囲だったはず)。

で、Direct3Dの頂点シェーダプログラミングの頂点の出力はこのw成分で除算する直前の値を出力すればOKなわけです(w除算までやらないのは、それはもっと先の工程で行われるので)。

そうすると下記のようなHLSLのコードが何してるか分かりますね。

// 事前にワールド×ビュー×プロジェクションは計算しておく
float4x4 mWVP : WorldViewProjection;

float4 VS_Main(float4 inPos : POSITION ) : POSITION
{
return mul( inPos, mWVP );
}

mul()関数というのは単にベクトルや行列同士の乗算関数(ベクトル×行列でも可です)なので、頂点シェーダが何をやってるかってのはすぐ分かりますね。ここで、わりと説明が下手なのがピクセルシェーダで特に上流工程である頂点シェーダとピクセルシェーダでのデータのやり取りとか、ピクセルシェーダが対象としている”ピクセル”がそもそも何を指してるかというのを容易に説明できないとねぇ(その辺は,”Programming Vertex and Pixel Shaders ”のpp18あたりとかで分かるかなぁ・・・)。

そんなわけで、こういうノリでFX ComposerとかRenderMonkeyで解説をし始めるとDirect3DやOpenGLのAPIは分からんけどHLSLやGLSLでプログラミングができるって人(本業はMaxやMayaなどでモデリングをしてるアーティストを対象)を育てることができんかねぇ。

…というか3D APIは使ってますけど、トランスフォームからラスタライズまでの仕組みを知らないという人は結構いるのかも。それが分かってればGPUのパイプラインの工程を見て各シェーダプログラミングはどのフェイズで何をしているのかは一目瞭然ですよね?

リアルタイムの3DCGプログラマがリアルタイムシェーディング言語(別に言語は何でもよい)を覚えるのは当たり前すぎますが、そうでない人にも広がっていくことがひいては世の中(3DCGの世界)をよくしていくことですよね。

※この記事に関しては間違い(私は独学でわりと知識があやふやでいい加減なので)とかの指摘とか、ご意見・感想をお待ちしております。わりとShader.jpの記事をどうしようかという話でもあるんで(・・・というか他人の趣向がよく分からんし)。

« しまったな | トップページ | 動機 »

Programming」カテゴリの記事

学問・資格」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2210/2679605

この記事へのトラックバック一覧です: 3DCGの仕組みとシェーダプログラミングを同時に教える:

« しまったな | トップページ | 動機 »