UnityのシェーダーでVTF(vertex texture fetch)

こんにちは。ヤマヤタケシです。

春まっさかりです。
そんな陽気のせいでしょうか?
テクスチャにバンプマップがあると、ついつい法線方向に頂点を動かしたくなります。

やりながら、いろいろ調べました。
頂点テクスチャフェッチ(VTF)
[WebGL] 頂点テクスチャフェッチを使って、テクスチャからデータを読みだしてみ

やってみたのですが、
float3 bump = tex2D(_BumpTex, float4(o.uv,0,0));
が、
「Shader error in ‘test/test’: cannot map expression to vs_4_0 instruction set at line 73 (on d3d11)」
とかエラーが出るんですよ。

ぬぉぉぉ。
テクスチャにアクセスするならtex2Dでしょ?
っておもっていたら、tex2D はダメで、tex2Dlod を使う必要がありました。
なんてこった。

なんでー?
ってググったら、これがヒット。

引用します!
うにばな (エフェクト用途のシェーダに関するアイデア 2)

vertexシェーダ内でテクスチャを参照する場合は tex2D の代わりに tex2Dlod を使用します。
tex2Dlod( テクスチャ, float4(U値, V値, 0, w =( lod 値の指定0~7 ))
これは テクスチャlodの値がdepth値(カメラからの距離)によって決定されるため depth値がvertexシェーダでメッシュのソートが解決されてPixelシェーダにデータが渡るときに計算が行われるので vertexシェーダ内ではlodの自動割り当てが出来なくなり 直接lod値を指定してあげる必要があるからです。

言われてみれば、納得ですが・・・
そもそもtex2Dlodの存在を知らなかったので、ハマるべくしてハマりました。

ついでに法線どうする問題も調べました。
頂点を動かしたバンプマップをX,Yで偏微分すれば面の接線が2本とれるから、その外積を取ればいいじゃん!
おわり!

ふう。。。

そんじゃまた。


コメントを残す

メールアドレスが公開されることはありません。