« 日亜化学、404 特許を放棄 | メイン | サブカテゴリー »

2006年02月12日

RenderMonkey(1) モデルデータとシェーダプログラム

RenderMonkey 付属のモデルデータは 3ds Max の .3ds ファイルが多くあります。どういった形状なのかを確認するためには Max などのモデラソフトが必要ですが、ここでは簡単に Metasequoia を利用してみます。Metasequoia にはシェアウェア版と無償版がありますが、無償版では .3ds ファイルは開けないようなのでシェアウェア版を使います。Metasequoia を使う理由は形状と大きさを見るためです。

RnderMonkey_Metasequoia.jpg
fig.1 RenderMonkey1.6 と Metasequoia2.3.4

このキャプチャ画像では Metasequoia は [表示] → [グリッドの設定] でメッシュの大きさを 100 にしています。ここで確認できるように RenderMonkey 付属のデータは float で 100.0 前後のデータであることがわかります。

先を急ぐ前に Metasequoia での .3ds ファイルのロードに関して。標準で .3ds をオープンしようとすると Metasequoia は Max の座標軸で開こうとします[fig.2(a)]。これを OpenGL の座標にあわせるために 3D Atelier を選択します[fig.2(b)(c)]。[fig.1] は 3D Atelier の座標軸で開いた状態です。ここでの RenderMonkey は Anisotropic.rfx を開いており、そのときの視点に関する情報は Camera ダイアログに表示されています。どちらとも OpenGL の座標系で統一されていることが確認できます。

open_3DStudio.jpgopen_axis.jpgopen_3DAtelier.jpg
fig.2(a) 3dsMax 座標軸fig.2(b) 座標軸選択fig.2(c) 3D Atelier 座標軸

.3ds ファイルが確認できるようになったところで RenderMonkey 付属のデータの確認をしてみます[fig.3]。大体 100.0 程度のモデルであることがわかります。この大きさは shader を記述する際に必要な数値となります。

RnderMonkey_models.jpg
fig.3 主なモデルデータ

注意点として、ここで示した 100.0 前後のモデル以外に 1.0 前後のモデルもあります。cube で言えば Cube.3ds は 2.0 で TexturedCube.3ds は 100.0 前後の大きさです。

さて、モデルの大きさと shader に関してだけ記述しておきます。cube を例にとり、まずモデルを読み込みます。大きさの違いを見るために Cube.3ds と TexturedCube.3ds を使います[fig.4]。

AddModel.jpg
fig.4 モデルの追加

ここで shader との関連を見るために、Vertex Program と Fragment Program を次のように修正します。変数などはそのままにしておきます。

uniform float noiseRate;
uniform mat4 view_proj_matrix;


attribute vec3 rm_Binormal;
attribute vec3 rm_Tangent;

varying vec3 vNormal;
varying vec3 vTangent;
varying vec3 vBinormal;
varying vec3 vViewVec;
varying vec3 vPos;

void main(void)
{
   gl_Position = ftransform();
   vPos      = gl_Vertex.xyz * noiseRate;
/*
   vTangent  = gl_NormalMatrix * rm_Tangent;
   vNormal   = gl_NormalMatrix * gl_Normal;
   vBinormal = gl_NormalMatrix * rm_Binormal;
    
   vViewVec.xyz    = vec3(  gl_ModelViewMatrix * gl_Vertex );
   // OpenGL has a different handedness, so we need to flip the z.
   vViewVec.z  = -vViewVec.z;
   
   vPos      = gl_Vertex.xyz * noiseRate;
*/   
}
fig.5 Vertex Program
uniform sampler3D Noise;
uniform vec4 lightDir;
uniform vec4 gloss;
uniform vec4 color;
uniform float noiseScale;

varying vec3 vNormal;
varying vec3 vTangent;
varying vec3 vBinormal;
varying vec3 vViewVec;
varying vec3 vPos;


varying vec3 pos;void main(void)
{
   gl_FragColor = texture3D(Noise, vPos);
/*
   vec3 viewVec = normalize(vViewVec);
   vec3 oglLightDir = vec3(lightDir.x, lightDir.y, -lightDir.z);

   // Grab an angle to rotate the tangent around the normal
   // This is done to create a slightly bumpy feeling
   float angle = noiseScale * (texture3D(Noise, vPos) - 0.5).x;

   // Our angle is within the [-PI, PI] range and we need both
   // the sine and cosine. Perfect for the sincos function,
   // which will save us some hardware instructions over separate
   // sin and cos calls.
   float cosA, sinA;
   sinA = sin(angle);
   cosA = cos(angle);

   // Rotate tangent around the normal
   vec3 tang =  sinA * vTangent + cosA * vBinormal;

   // Do the anisotropic lighting
   float diffuse = clamp( dot( oglLightDir.xyz, vNormal ), 0.0, 1.0 );
   float cs = -dot(viewVec, tang);
   float sn = sqrt(1.0 - cs * cs);
   float cl =  dot(oglLightDir.xyz, tang);
   float sl = sqrt(1.0 - cl * cl);
   float specular = pow( clamp( (cs * cl + sn * sl), 0.0, 1.0 ), 32.0);

   // Output the results
   gl_FragColor = diffuse * color + gloss * specular;
*/    
}
fig.6 Fragment Program

あとはリファレンスノードを Cube もしくは TexturedCube に変更します。ここでは Cube にしてみます[fig.7]。

ChangeReferenceNode.jpg
fig.7 リファレンスノード変更

Cube はサイズが 2.0 なので視点位置を変更します。また、これにあわせて noiseRate の値を変更してみます[fig.8]。Vertex Program で設定した vPos により頂点座標がそのままテクスチャ座標になっているので、ここではテクスチャ座標が [-1, 1] になり 2 回リピートしているのがわかります。

ChangeNoiseRate.jpg
fig.8 noiseRate 変更

再度リファレンスノードを変更し、今度は TexturedCube にしてみると、モデルの大きさと shader パラメータの関連がわかると思います[fig.9]。

TexturedCube.jpg
fig.9 リファレンスノードを TexturedCube に変更

意外と簡単ですが、やはりモデルデータの大きさを RenderMonkey だけでわかれば楽だったろうに、と思いますね。


投稿者 napier : 2006年02月12日 01:12


トラックバック

このエントリーのトラックバックURL:
http://will.squares.net/mt/mt-modified-tb.cgi/281