現在地メニュー >> Cg >> Cg編06
Index :Cg編05<< Cg編06 >> Cg編07

アニメーション


アニメーションの方法にはいくつかあり、
  • 移動させてしまって、投影変換だけをGPUでやる
  • 移動要素(回転角度など)を与えてGPU内で移動+投影変換する
  • … …
など様々な方法がある。

CPUで移動させてしまって、GPUで投影変換だけする


glRotate関数などで行列を全て設定した後に、cgGLSetStateMatrixParameter関数で行列を取得する。

main.cpp
CGprogram CgVertexProgram;
CGparameter CgModelViewProj; //CGparameter型(ModelProj行列を取得)
… …

static int angle = 0;
glPushMatrix();
glRotatef(static_cast<float>(angle),0,1,0);

//現在のmodelview,projection行列を取得
cgGLSetStateMatrixParameter(
	CgModelViewProj,
	CG_GL_MODELVIEW_PROJECTION_MATRIX,
	CG_GL_MATRIX_IDENTITY);
cgUpdateProgramParameters(CgVertexProgram);//プログラムのパラメータの更新

glutWireTorus(0.2,0.5,30,30);
glPopMatrix();

vertex.cg
… …
//-------- 頂点シェーダメイン関数 ---------//
VertexOut CgVertexMain(in VertexIn input,uniform float4x4 modelViewProj)
{
	VertexOut output;//出力用
	output.position = mul(modelViewProj, input.position);

	output.color = input.color;//色

	return output;
}
▲シェーダは何も変更なし

GPU内で移動と投影変換を行う


GPU内で移動の計算も行った方が効率的になる。

【例】:回転角度を与える

main.cpp

CGparameter CgVertexRotAngle;//頂点シェーダ回転角度
CgVertexRotAngle = cgGetNamedParameter(CgVertexProgram, "rotAngle");
… …
static int angle = 0;
cgSetParameter1f(CgVertexRotAngle, static_cast<float>(angle)); //GPUで使う回転角度値の設定
draw();//GPUで回転を行う
… …
if(++angle >= 360){angle = 0;}

vertex.cg
… …
//-------- 頂点シェーダメイン関数 ---------//
VertexOut CgVertexMain(in VertexIn input,
					   uniform float4x4 modelViewProj,
					   uniform float rotAngle)
{
	//度数→ラジアン
	float radAngle = radians(rotAngle);
	float SinData,CosData;
	
	sincos(radAngle,SinData,CosData); //sin(angle)とcos(angle)を計算しそれぞれ格納


	VertexOut output;//出力用

	output.position[0] = CosData*input.position[0] + SinData*input.position[2];
	output.position[1] = input.position[1];
	output.position[2] = -SinData*input.position[0] + CosData*input.position[2];
	output.position[3] = input.position[3];


	//回転移動したものを透視投影
	output.position = mul(modelViewProj, output.position);

	output.color = input.color;//色

	return output;
}

サンプルコード

×

この広告は60日間更新がないwikiに表示されております。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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