mieki256's diary



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 として置いときます。

関係ありそうなところをメモ。 :

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』 によると、ハーフランバートなるものがあるらしいので試したり。

参考ページ。 :


以上です。

過去ログ表示

Prev - 2017/04 - Next
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project