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

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

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

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

Q&A

解決済

1回答

1356閲覧

Unityの自作シェーダーでポイントライトが四角く描画されてしまう。

pofuda

総合スコア1

Unity

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

0グッド

0クリップ

投稿2022/03/11 04:51

UnityのシェーダープログラムForwardAddについての質問です。
ポイントライトのシェーダーを追加しようと思い"LightMode" = "ForwardAdd"のシェーダーを作成しました。
その際、こちらのサイトを参考にしました。
https://light11.hatenadiary.com/entry/2018/07/12/002823

しかし、ポイントライトの範囲内で光源の色が四角く描画されてしまいます。
こちらの原因がなにか教えていただけないでしょうか。

イメージ説明

画像が潰れて見えない可能性があるため、ソースコードを記載しました。
宜しくお願い致します。

v2f vert(appdata v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.color = v.color;
o.normal = UnityObjectToWorldNormal(v.normal);
o.posW = mul(unity_ObjectToWorld, v.vertex);
return o;
}

fixed4 frag(v2f i) : SV_Target
{
half3 lightDir;
if (_WorldSpaceLightPos0.w > 0) {
lightDir = _WorldSpaceLightPos0.xyz - i.posW.xyz;
} else {
lightDir = _WorldSpaceLightPos0.xyz;
}
lightDir = normalize(lightDir);

UNITY_LIGHT_ATTENUATION(attenuation, i, i.normal);
half3 diff = max(0, dot(i.normal, lightDir)) * _LightColor0 * attenuation;

fixed4 col = i.color;
col.rgb *= diff;
return col;
}

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

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

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

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

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

guest

回答1

0

ベストアンサー

ご質問者さんの場合は少々アレンジを加えていらっしゃるようですが、どうやらご提示の「【Unity】【シェーダ】Forward Renderingで複数のライトを取り扱う - LIGHT11」のシェーダーコードをそのまま使っても同様の現象が起こるみたいですね。

どうもattenuationが変な値になっているような気がします。UNITY_LIGHT_ATTENUATIONは下記のように定義されており...

HLSL

1#ifdef POINT 2sampler2D_float _LightTexture0; 3unityShadowCoord4x4 unity_WorldToLight; 4# define UNITY_LIGHT_ATTENUATION(destName, input, worldPos) \ 5 unityShadowCoord3 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(worldPos, 1)).xyz; \ 6 fixed shadow = UNITY_SHADOW_ATTENUATION(input, worldPos); \ 7 fixed destName = tex2D(_LightTexture0, dot(lightCoord, lightCoord).rr).r * shadow; 8#endif 9 10#ifdef SPOT 11sampler2D_float _LightTexture0; 12unityShadowCoord4x4 unity_WorldToLight; 13sampler2D_float _LightTextureB0; 14inline fixed UnitySpotCookie(unityShadowCoord4 LightCoord) 15{ 16 return tex2D(_LightTexture0, LightCoord.xy / LightCoord.w + 0.5).w; 17} 18inline fixed UnitySpotAttenuate(unityShadowCoord3 LightCoord) 19{ 20 return tex2D(_LightTextureB0, dot(LightCoord, LightCoord).xx).r; 21} 22#if !defined(UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS) 23#define DECLARE_LIGHT_COORD(input, worldPos) unityShadowCoord4 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(worldPos, 1)) 24#else 25#define DECLARE_LIGHT_COORD(input, worldPos) unityShadowCoord4 lightCoord = input._LightCoord 26#endif 27# define UNITY_LIGHT_ATTENUATION(destName, input, worldPos) \ 28 DECLARE_LIGHT_COORD(input, worldPos); \ 29 fixed shadow = UNITY_SHADOW_ATTENUATION(input, worldPos); \ 30 fixed destName = (lightCoord.z > 0) * UnitySpotCookie(lightCoord) * UnitySpotAttenuate(lightCoord.xyz) * shadow; 31#endif 32 33#ifdef DIRECTIONAL 34# define UNITY_LIGHT_ATTENUATION(destName, input, worldPos) fixed destName = UNITY_SHADOW_ATTENUATION(input, worldPos); 35#endif 36 37#ifdef POINT_COOKIE 38samplerCUBE_float _LightTexture0; 39unityShadowCoord4x4 unity_WorldToLight; 40sampler2D_float _LightTextureB0; 41# if !defined(UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS) 42# define DECLARE_LIGHT_COORD(input, worldPos) unityShadowCoord3 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(worldPos, 1)).xyz 43# else 44# define DECLARE_LIGHT_COORD(input, worldPos) unityShadowCoord3 lightCoord = input._LightCoord 45# endif 46# define UNITY_LIGHT_ATTENUATION(destName, input, worldPos) \ 47 DECLARE_LIGHT_COORD(input, worldPos); \ 48 fixed shadow = UNITY_SHADOW_ATTENUATION(input, worldPos); \ 49 fixed destName = tex2D(_LightTextureB0, dot(lightCoord, lightCoord).rr).r * texCUBE(_LightTexture0, lightCoord).w * shadow; 50#endif 51 52#ifdef DIRECTIONAL_COOKIE 53sampler2D_float _LightTexture0; 54unityShadowCoord4x4 unity_WorldToLight; 55# if !defined(UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS) 56# define DECLARE_LIGHT_COORD(input, worldPos) unityShadowCoord2 lightCoord = mul(unity_WorldToLight, unityShadowCoord4(worldPos, 1)).xy 57# else 58# define DECLARE_LIGHT_COORD(input, worldPos) unityShadowCoord2 lightCoord = input._LightCoord 59# endif 60# define UNITY_LIGHT_ATTENUATION(destName, input, worldPos) \ 61 DECLARE_LIGHT_COORD(input, worldPos); \ 62 fixed shadow = UNITY_SHADOW_ATTENUATION(input, worldPos); \ 63 fixed destName = tex2D(_LightTexture0, lightCoord).w * shadow; 64#endif

マクロの第3引数には注目点のワールド座標を入力することを期待しているようでした。ですので、シェーダーコード内のUNITY_LIGHT_ATTENUATION(attenuation, i, i.normal);という部分をUNITY_LIGHT_ATTENUATION(attenuation, i, i.posW);に変更してみてはいかがでしょうか?

投稿2022/03/11 16:35

Bongo

総合スコア10807

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問