質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

513閲覧

World座標を基準にしたBumped Diffuseシェーダー

nomet

総合スコア25

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/01/25 01:37

下記の質問に回答いただいているTileShaderシェーダーをNormalmap対応したいです。
https://teratail.com/questions/90669

やりたいこととしては、大小さまざまなCubeに対し、テクスチャのタイリングのサイズを固定して表示したいです。(Cubeのサイズに応じて個別のマテリアルを作成することなく。)

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

手軽にやるとしたら、アルベドと同じように法線も三方向を単純合成してやればいいかと思います。

ただし一点分かりづらい点がありまして、合成比率を決めるのにワールド法線が必要になりますが、ワールド法線の取得方法としてサーフェスシェーダーの記述 - Unity マニュアルには...

float3 worldNormal; INTERNAL_DATA - サーフェスシェーダーが o.Normal に書き込む場合のワールドの反射ベクトルを含みます。ピクセル法線マップに基づいて法線ベクトルを取得するには、WorldNormalVector (IN, o.Normal) を使用します。

とあります。「反射ベクトル」は正しくは「法線ベクトル」の間違いでしょうが、それにしても前半部だけを読むとo.Normalへの書き込みを行うシェーダーでもINTERNAL_DATAを付けるだけで同様にIN.worldNormalからワールド法線を取れるように思えます。ですが実際にはどうもうまくいかず、後半部に言及されているWorldNormalVectorを使う必要があるようです。

それをふまえて、KapustinさんのTileShaderを下記のように改造してみてはいかがでしょうか?

ShaderLab

1// Upgrade NOTE: upgraded instancing buffer 'Props' to new syntax. 2 3Shader "Custom/BumpedTileShader" { 4 Properties { 5 _Color ("Color", Color) = (1,1,1,1) 6 _MainTex ("Albedo (RGB)", 2D) = "white" {} 7 _BumpMap ("Normal", 2D) = "bump" {} // 法線マップ用のプロパティを追加 8 _Glossiness ("Smoothness", Range(0,1)) = 0.5 9 _Metallic ("Metallic", Range(0,1)) = 0.0 10 _TileScale ("TileScale", Range(0.1, 10)) = 1 11 } 12 SubShader { 13 Tags { "RenderType"="Opaque" } 14 LOD 200 15 16 CGPROGRAM 17 // Physically based Standard lighting model, and enable shadows on all light types 18 #pragma surface surf Standard fullforwardshadows 19 20 // Use shader model 3.0 target, to get nicer looking lighting 21 #pragma target 3.0 22 23 sampler2D _MainTex; 24 sampler2D _BumpMap; // 法線マップ用の変数を追加 25 26 struct Input { 27 float2 uv_MainTex; 28 float3 worldPos; 29 float3 worldNormal; 30 INTERNAL_DATA // surf内でo.Normalへの書き込みを行っているので、INTERNAL_DATAを付ける 31 }; 32 33 half _Glossiness; 34 half _Metallic; 35 fixed4 _Color; 36 half _TileScale; 37 38 // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader. 39 // See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing. 40 // #pragma instancing_options assumeuniformscaling 41 UNITY_INSTANCING_BUFFER_START(Props) 42 // put more per-instance properties here 43 UNITY_INSTANCING_BUFFER_END(Props) 44 45 void surf (Input IN, inout SurfaceOutputStandard o) { 46 // o.Normalへの書き込みを行っている場合はsurfの動作が変化し、IN.worldNormalからはワールド法線を取得できなくなる 47 // 代わりに、接空間における凹凸なしベクトル(0, 0, 1)をワールド空間に変換しワールド法線とする 48 // IN.worldNormalは使用していないためInput中のworldNormal宣言は無駄に思えるが、かといって削除してしまうとうまくいかない 49 float3 worldNormal = WorldNormalVector(IN, float3(0.0, 0.0, 1.0)); 50 51 // factorX、factorY、factorZの合計が1になっていないようだったため、1にするよう変更 52 float3 factor = abs(worldNormal); 53 factor /= dot(factor, 1.0); 54 55 float3 scaledWorldPos = IN.worldPos / _TileScale; 56 57 fixed4 cx = tex2D (_MainTex, float2(scaledWorldPos.z, scaledWorldPos.y)) * factor.x; 58 fixed4 cy = tex2D (_MainTex, float2(scaledWorldPos.x, scaledWorldPos.z)) * factor.y; 59 fixed4 cz = tex2D (_MainTex, float2(scaledWorldPos.x, scaledWorldPos.y)) * factor.z; 60 61 fixed4 c = (cx + cy + cz); 62 63 // アルベドと同様に、法線も三方向からサンプリングして合成する 64 float4 nx = tex2D (_BumpMap, float2(scaledWorldPos.z, scaledWorldPos.y)) * factor.x; 65 float4 ny = tex2D (_BumpMap, float2(scaledWorldPos.x, scaledWorldPos.z)) * factor.y; 66 float4 nz = tex2D (_BumpMap, float2(scaledWorldPos.x, scaledWorldPos.y)) * factor.z; 67 68 float3 n = UnpackNormal(nx + ny + nz); 69 70 o.Albedo = c.rgb; 71 o.Normal = n; 72 o.Metallic = _Metallic; 73 o.Smoothness = _Glossiness; 74 o.Alpha = c.a; 75 } 76 ENDCG 77 } 78 FallBack "Diffuse" 79}

実はよく見ると凹凸部分の陰影がおかしいことにお気付きになるかもしれません。
以前別の方の類似したご質問にUnity - unityのマテリアルのサイズが一定にならない|teratail(あちらはワールド基準ではなくオブジェクト基準でのマッピングですが、理屈としては同じです)というものがあって調査したのですが、陰影の狂いを修正するには少々ややこしいことをやらねばならなそうでした。
多少陰影がおかしくても問題ないならいいのですが、さもなければ法線の向きを正しく修正するようコードを追加する必要があるかと思います。

投稿2019/01/25 18:25

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nomet

2019/01/31 01:04

返信が遅くなりまして、大変失礼しました。 いただいたシェーダーで実行したところ、やりたいことは実現できました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問