« 日亜化学、404 特許を放棄 | メイン | サブカテゴリー »
2006年02月12日
RenderMonkey(1) モデルデータとシェーダプログラム
RenderMonkey 付属のモデルデータは 3ds Max の .3ds ファイルが多くあります。どういった形状なのかを確認するためには Max などのモデラソフトが必要ですが、ここでは簡単に Metasequoia を利用してみます。Metasequoia にはシェアウェア版と無償版がありますが、無償版では .3ds ファイルは開けないようなのでシェアウェア版を使います。Metasequoia を使う理由は形状と大きさを見るためです。
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 の座標系で統一されていることが確認できます。
![]() | ![]() | ![]() |
| fig.2(a) 3dsMax 座標軸 | fig.2(b) 座標軸選択 | fig.2(c) 3D Atelier 座標軸 |
.3ds ファイルが確認できるようになったところで RenderMonkey 付属のデータの確認をしてみます[fig.3]。大体 100.0 程度のモデルであることがわかります。この大きさは shader を記述する際に必要な数値となります。
fig.3 主なモデルデータ
注意点として、ここで示した 100.0 前後のモデル以外に 1.0 前後のモデルもあります。cube で言えば Cube.3ds は 2.0 で TexturedCube.3ds は 100.0 前後の大きさです。
さて、モデルの大きさと shader に関してだけ記述しておきます。cube を例にとり、まずモデルを読み込みます。大きさの違いを見るために Cube.3ds と TexturedCube.3ds を使います[fig.4]。

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;
*/
}
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;
*/
}
あとはリファレンスノードを Cube もしくは TexturedCube に変更します。ここでは Cube にしてみます[fig.7]。

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

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

fig.9 リファレンスノードを TexturedCube に変更
意外と簡単ですが、やはりモデルデータの大きさを RenderMonkey だけでわかれば楽だったろうに、と思いますね。
投稿者 napier : 2006年02月12日 01:12
トラックバック
このエントリーのトラックバックURL:
http://will.squares.net/mt/mt-modified-tb.cgi/281


