So I was writing a simple triplanar mapping shader and while doing so encountered a bug where when using IN.worldNormal in code while writing to o.Normal would result in the albedo turning black as can be seen below: https://ibb.co/n1DHC8
Here is the complete shader code (bug tested on webGl as well as Windows DX11):

Shader "Custom/NormalMappedTest" {
Properties {
    _Color ("Color", Color) = (1,1,1,1)
    _MainTex ("Albedo (RGB)", 2D) = "white" {}
    _NormalMap("Normal Map", 2D) = "bump" {}
    _Glossiness ("Smoothness", Range(0,1)) = 0.5
    _Metallic ("Metallic", Range(0,1)) = 0.0
SubShader {
    Tags { "RenderType"="Opaque" }
    LOD 200

    // Physically based Standard lighting model, and enable shadows on all light types
    #pragma surface surf Standard fullforwardshadows

    // Use shader model 3.0 target, to get nicer looking lighting
    #pragma target 3.0

    sampler2D _MainTex;
    sampler2D _NormalMap;

    struct Input {
        float2 uv_MainTex;
        float2 uv_NormalMap;
        float3 worldPos;
        float3 worldNormal; INTERNAL_DATA

    half _Glossiness;
    half _Metallic;
    fixed4 _Color;

    // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
    // See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
    // #pragma instancing_options assumeuniformscaling
        // put more per-instance properties here

    void surf (Input IN, inout SurfaceOutputStandard o) {
        // Albedo comes from a texture tinted by color
        fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;

        //Even just having this here causes the bug         
        float3 wnrm = abs(normalize(IN.worldNormal));

        float3 nrm = UnpackNormal(tex2D(_NormalMap, IN.worldPos.xz));

        o.Albedo = IN.worldNormal;// c.rgb;
        o.Normal = nrm;
        // Metallic and smoothness come from slider variables
        o.Metallic = _Metallic;
        o.Smoothness = _Glossiness;
        o.Alpha = c.a;
FallBack "Diffuse"

Any help would be appreciated, thanks in advance, - Thomas


1 Answer 1


It's a bit frustraiting. According to Unity Manual Input structure section you have to use WorldNormalVector (IN, o.Normal) instead of IN.worldNormal if you are writing to o.Normal


You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .