« 日亜化学、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