現在地 >> メニュー >> サンプルコード::Cg >> Cg::基本編05 >> Cg::アニメーション2

アニメーション2


OpenGLの描画はそのままで、
回転などによる頂点位置の計算をGPUにさせる場合、必要なものは回転角度である。
(※cgのサンプル「06_vertex_twisting」を参考にしています)

[例]
CGparameter RotAngle;
... ...
	RotAngle = cgGetNamedParameter(CgVertexProgram, "RotAngleY");//GPU上での名前付け
... ...

	static float r = 0;
	cgSetParameter1f(RotAngle, r); //GPUで使う回転角度値の設定
	glColor3f(1,0,1);
	glRectf(-1,1,1,-1);//描画

メモ


「cgSetParameter*()関数」でGPUの変数にCPUの値を設定している。
(※今回はfloatで1次元なのでcgSetParameter1f()となる)

GPUでの計算(回転の計算)


GPU側に回転角度を渡したので、それをもとに頂点を回転させる。
例えばY軸を中心に回転する場合、以下のような表現ができる。




これを頂点シェーダで記述し、透視投影する

[例]
//-------- 各種データ構造 --------//
struct InputVertex	//入力データ構造
{
	float4 position : POSITION;
	float3 color : COLOR;
};

struct OutputVertex	//出力データ構造
{
	float4 position : POSITION;
	float3 color : COLOR;
};

//-------- 頂点シェーダメイン関数 ---------//
OutputVertex Cg_Main(in InputVertex input, uniform float4x4 modelViewMatrix, uniform float RotAngleY)
{
	float angle = radians(RotAngleY); //「度」を「ラジアン」に変換
	float SinData,CosData;
	sincos(angle,SinData,CosData); //sin(angle)とcos(angle)を計算しそれぞれ格納
	
	//頂点をy軸中心で回転移動させる
	OutputVertex OUT;
	OUT.position[0] = CosData*input.position[0] + SinData*input.position[2]; //x座標
	OUT.position[1] = input.position[1]; //y座標
	OUT.position[2] = -SinData*input.position[0] + CosData*input.position[2]; //z座標
	OUT.position[3] = input.position[3]; //w座標
	
	
	OUT.position = mul(modelViewMatrix, OUT.position); //透視投影
	OUT.color = input.color; //色はそのまま

	return OUT;
}

サンプルコード

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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