×
現在地:メニュー >> Cg >> Cg編03
Index :Cg編02<< Cg編03 >> Cg編04

座標系


シェーダの場合は座標系の理解が必要。

透視投影


頂点シェーダはこの図の中の「Clip Space」の出力をすればよい。
すなわち、与えられた頂点座標に対し「ModelView行列」と「Projection行列」を演算すれば、透視投影することができる。


【例】:頂点シェーダの記述例
//modelViewProjはmodelViewとProjectionを1つにまとめたもの
VertexOut CgVertexMain(in VertexIn input,uniform float4x4 modelViewProj)
{
	VertexOut output;//出力用
	output.position = mul(modelViewProj, input.position);

	output.color = input.color;//色

	return output;
}

シェーダに値をわたす

◆unifom型

Cgでは「uniform型」というのが出てくる。

シェーダの関数は頂点データがシェーダにやってくるたびに呼ばれる。
つまり、入力としての頂点データはそのたびに異なるものである。

しかし、異なる頂点データであっても例えば投影変換用に行列を演算する場合、
シェーダの関数がよばれても、その演算用の行列はかわらない。

このように定数となっているものは「uniform型」として扱う。

※なお、Cgでは「const定数」も提供されており、その場合はC++と同様に値の変更ができない。

◆CPU側での設定


シェーダ側に定数を渡すには、「CGparameter型」を使う。
これは「頂点シェーダ」、「フラグメントシェーダ」どちらも共通で次のようにして使う。
  1. CGparameter型を用意
  2. 名前および、対象のシェーダとの関連付け
  3. 値の設定

【例】
CGprogram CgVertexProgram;
CGparameter CgModelViewProj; //CGparameter型
… …
//頂点シェーダと関連付け、シェーダ内の変数名は「modelViewProj」
CgModelViewProj = cgGetNamedParameter(CgVertexProgram, "modelViewProj");
… …
//値の設定
cgGLSetStateMatrixParameter(CgModelViewProj,
			CG_GL_MODELVIEW_PROJECTION_MATRIX,
			CG_GL_MATRIX_IDENTITY);
… …
▲この例では、「ModelView行列」と「Projection行列」をまとめた行列を取得している。


■CGparameter cgGetNamedParameter( CGprogram program,const char * name );
名前によって、シェーダプログラムのパラメータを取得する。(CGparameter型関連付ける)
【program】
頂点シェーダか、フラグメントシェーダかをどちらかのCGprogram型を渡す
【name】
シェーダに関連付ける名前を指定する



■void cgGLSetStateMatrixParameter( CGparameter param,CGGLenum matrix,CGGLenum transform );
CGparameter型に指定された行列の値を設定する。
【param】
値を設定したい「CGparameter型」を指定。
【matrix】
何の行列を取得するかを指定する。
次の4つが可能
  • CG_GL_MODELVIEW_MATRIX(モデルビュー行列)
  • CG_GL_PROJECTION_MATRIX(プロジェクション行列)
  • CG_GL_TEXTURE_MATRIX(テクスチャ行列)
  • CG_GL_MODELVIEW_PROJECTION_MATRIX(モデルビュー行列とプロジェクション行列をまとめたもの)

【tranform】
取得する行列に、何の変換を与えてから行列を取得するかどうかの設定。
次の4つが可能
  • CG_GL_MATRIX_IDENTITY(そのまま取得)
  • CG_GL_MATRIX_TRANSPOSE(転置する)
  • CG_GL_MATRIX_INVERSE(逆行列にする)
  • CG_GL_MATRIX_INVERSE_TRANSPOSE(逆行列と転置をする)

シェーダ側で受け取る


シェーダ側でうけとる場合は、「uniform」をつける。

例えば透視投影の場合は「4×4のfloat型の行列」が必要なので、
【CPU側】
CGparameter CgModelView;
CGparameter CgProjection;
… …
//関連付け
CgModelView = cgGetNamedParameter(CgVertexProgram, "modelViewMat"); //モデルビュー行列
CgProjection = cgGetNamedParameter(CgVertexProgram, "ProjectionMat"); //プロジェクション行列
… …
//値設定
cgGLSetStateMatrixParameter(CgModelView,CG_GL_MODELVIEW_MATRIX,CG_GL_MATRIX_IDENTITY);
cgGLSetStateMatrixParameter(CgProjection,CG_GL_PROJECTION_MATRIX,CG_GL_MATRIX_IDENTITY);
… …
というようにCPU側で設定したら、
【シェーダ側】
//-------- 頂点シェーダメイン関数 ---------//
VertexOut CgVertexMain(in VertexIn input,
					   uniform float4x4 modelViewMat,
					   uniform float4x4 ProjectionMat)
{
	VertexOut output;//出力用
	output.position = mul(modelViewMat, input.position);
	output.position = mul(ProjectionMat, output.position);

	output.color = input.color;//色

	return output;
}
となる。

透視投影の簡略化


繰り返しになるが、与えられた頂点座標に対し「ModelView行列」と「Projection行列」を演算すれば、
透視投影することができる。

しかしいちいち、2つの行列を取得していては面倒なので、
1つにまとめた行列を取得して投影変換をすることもできる。
それが「CG_GL_MODELVIEW_PROJECTION_MATRIX」である。

上の最初にあげた例のようにこの行列を演算すれば、透視投影ができる。
【例】:頂点シェーダの記述例
//modelViewProjはmodelViewとProjectionを1つにまとめたもの
VertexOut CgVertexMain(in VertexIn input,uniform float4x4 modelViewProj)
{
	VertexOut output;//出力用
	output.position = mul(modelViewProj, input.position);

	output.color = input.color;//色

	return output;
}

サンプルコード

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます

広告募集中