最終更新:
mikk_ni3_92 2009年12月14日(月) 19:05:14履歴
現在地:メニュー >> Cg >> Cg編03
Index :Cg編02<< Cg編03 >> Cg編04
頂点シェーダはこの図の中の「Clip Space」の出力をすればよい。
すなわち、与えられた頂点座標に対し「ModelView行列」と「Projection行列」を演算すれば、透視投影することができる。
【例】:頂点シェーダの記述例
シェーダ側に定数を渡すには、「CGparameter型」を使う。
これは「頂点シェーダ」、「フラグメントシェーダ」どちらも共通で次のようにして使う。
【例】
■CGparameter cgGetNamedParameter( CGprogram program,const char * name );
名前によって、シェーダプログラムのパラメータを取得する。(CGparameter型関連付ける)
【program】
頂点シェーダか、フラグメントシェーダかをどちらかのCGprogram型を渡す
【name】
シェーダに関連付ける名前を指定する
■void cgGLSetStateMatrixParameter( CGparameter param,CGGLenum matrix,CGGLenum transform );
CGparameter型に指定された行列の値を設定する。
【param】
値を設定したい「CGparameter型」を指定。
【matrix】
何の行列を取得するかを指定する。
次の4つが可能
【tranform】
取得する行列に、何の変換を与えてから行列を取得するかどうかの設定。
次の4つが可能
シェーダ側でうけとる場合は、「uniform」をつける。
例えば透視投影の場合は「4×4のfloat型の行列」が必要なので、
【CPU側】
【シェーダ側】
繰り返しになるが、与えられた頂点座標に対し「ModelView行列」と「Projection行列」を演算すれば、
透視投影することができる。
しかしいちいち、2つの行列を取得していては面倒なので、
1つにまとめた行列を取得して投影変換をすることもできる。
それが「CG_GL_MODELVIEW_PROJECTION_MATRIX」である。
上の最初にあげた例のようにこの行列を演算すれば、透視投影ができる。
【例】:頂点シェーダの記述例
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;
}
Cgでは「uniform型」というのが出てくる。
シェーダの関数は頂点データがシェーダにやってくるたびに呼ばれる。
つまり、入力としての頂点データはそのたびに異なるものである。
しかし、異なる頂点データであっても例えば投影変換用に行列を演算する場合、
シェーダの関数がよばれても、その演算用の行列はかわらない。
このように定数となっているものは「uniform型」として扱う。
※なお、Cgでは「const定数」も提供されており、その場合はC++と同様に値の変更ができない。
シェーダの関数は頂点データがシェーダにやってくるたびに呼ばれる。
つまり、入力としての頂点データはそのたびに異なるものである。
しかし、異なる頂点データであっても例えば投影変換用に行列を演算する場合、
シェーダの関数がよばれても、その演算用の行列はかわらない。
このように定数となっているものは「uniform型」として扱う。
※なお、Cgでは「const定数」も提供されており、その場合はC++と同様に値の変更ができない。
シェーダ側に定数を渡すには、「CGparameter型」を使う。
これは「頂点シェーダ」、「フラグメントシェーダ」どちらも共通で次のようにして使う。
- CGparameter型を用意
- 名前および、対象のシェーダとの関連付け
- 値の設定
【例】
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;
}

