2017/04/02(日) [n年前の日記]
#1 [dxruby] フォンシェーディングっぽくなってきた気がするけどまだなんだか怪しい
DXRuby の CutomRender で3D描画の実験中。
鏡面反射をそれらしく見せてくれるという、フォン(Phong)シェーディングとやらができないものかと試しているのだけど…。なんとなくそれっぽくなってきた気がする。けど、なんだか、まだちょっと怪しい気もする。これで本当に正しく処理されているのだろうか…。何か間違えてないか…。
ソースは以下。
_crt_test06_phongshading.rb , hlsl_lambert.fx , hlsl_phong.fx
動作には _tinydaeparser.rb と _tinywavefrontobj.rb 、 _サンプルデータ が必要。
というか、ソースもデータもまとめておいたほうがいいのか…。 _customrender_sample.zip として置いときます。
鏡面反射をそれらしく見せてくれるという、フォン(Phong)シェーディングとやらができないものかと試しているのだけど…。なんとなくそれっぽくなってきた気がする。けど、なんだか、まだちょっと怪しい気もする。これで本当に正しく処理されているのだろうか…。何か間違えてないか…。
ソースは以下。
_crt_test06_phongshading.rb , hlsl_lambert.fx , hlsl_phong.fx
動作には _tinydaeparser.rb と _tinywavefrontobj.rb 、 _サンプルデータ が必要。
というか、ソースもデータもまとめておいたほうがいいのか…。 _customrender_sample.zip として置いときます。
◎ 関係ありそうなところをメモ。 :
hlsl_phong.fx の中の、Phongシェーディングと関係ありそうなところを抜き出してメモ。
// vertex shader with texture VS_OUT VS(VS_IN v) { ... output.vNormal = mul(v.vNormal, (float3x3)mWorld).xyz; output.vWPos = mul(v.vPosition, mWorld); output.vEyePos = mView[3].xyz; ... } // pixel shader with texture PS_OUT PS(VS_OUT p) { ... float3 light = normalize(vLightDir.xyz); float3 normal = normalize(p.vNormal); ... // specular float3 view = normalize(p.vEyePos - p.vWPos); float3 r = normalize(light - 2.0f * normal * dot(light, normal)).xyz; float spe = pow(max(dot(r, view), 0.0f), vMatShininess); // float3 halfway = normalize(light - view); // float spe = pow(max(dot(normal, halfway), 0.0f), vMatShininess); float3 specular = vMatSpecular * spe; ... }これで合ってるのですかね…? 分からん…。
◎ 気づいた点をメモ。 :
DXRuby開発版に同梱されていた公式サンプル、spheretest.rb の中の光源用変数は、位置座標じゃなくてライトの方向を示してたのですな…。それも、光源から頂点へのベクトルじゃなくて、頂点から光源へのベクトル、のように思えてきたり。
フォンシェーディングの計算をする際は、頂点から視点へのベクトルが必要なのだけど…。サンプル内では mView[3].xyz で似たような値が取り出せそうな気がする、けど、それで合っているのかどうか…。
_その39 知っていると便利?ワールド変換行列から情報を抜き出そう
_☆PROJECT ASURA☆ [OpenGL] 『ライティング(3) Lambert』 によると、ハーフランバートなるものがあるらしいので試したり。
フォンシェーディングの計算をする際は、頂点から視点へのベクトルが必要なのだけど…。サンプル内では mView[3].xyz で似たような値が取り出せそうな気がする、けど、それで合っているのかどうか…。
_その39 知っていると便利?ワールド変換行列から情報を抜き出そう
_☆PROJECT ASURA☆ [OpenGL] 『ライティング(3) Lambert』 によると、ハーフランバートなるものがあるらしいので試したり。
◎ 参考ページ。 :
以下を参考にしつつ試行錯誤しました。
_床井研究室 - 第1回 シェーダプログラムの読み込み
_床井研究室 - 第2回 Gouraud シェーディングと Phong シェーディング
_フォンシェーディング - Wikipedia
_Maverick Project
_DirectX9 プログラミングメモ - HLSL:フォン鏡面反射
_High Level Shading Language - Wikipedia
_☆PROJECT ASURA☆ [OpenGL] 『ライティング(3) Lambert』
ランバート反射については、以下の記事内の画像が分かりやすい、ような気もする。
_【Unityシェーダ入門】ランバート拡散照明モデルを試す - おもちゃラボ
_床井研究室 - 第1回 シェーダプログラムの読み込み
_床井研究室 - 第2回 Gouraud シェーディングと Phong シェーディング
_フォンシェーディング - Wikipedia
_Maverick Project
_DirectX9 プログラミングメモ - HLSL:フォン鏡面反射
_High Level Shading Language - Wikipedia
_☆PROJECT ASURA☆ [OpenGL] 『ライティング(3) Lambert』
ランバート反射については、以下の記事内の画像が分かりやすい、ような気もする。
_【Unityシェーダ入門】ランバート拡散照明モデルを試す - おもちゃラボ
[ ツッコむ ]
以上です。