最終更新: mikk_ni3_92 2008年12月21日(日) 17:28:24履歴
現在地 >> メニュー >> サンプルコード::Cg >> Cg::基本編05 >> Cg::アニメーション2
OpenGLの描画はそのままで、
回転などによる頂点位置の計算をGPUにさせる場合、必要なものは回転角度である。
(※cgのサンプル「06_vertex_twisting」を参考にしています)
[例]
GPU側に回転角度を渡したので、それをもとに頂点を回転させる。
例えばY軸を中心に回転する場合、以下のような表現ができる。
これを頂点シェーダで記述し、透視投影する
[例]
サンプルコード
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);//描画
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; }
サンプルコード