Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Have 3d text shader be non-emissive?

Tags:

unity3d

shader

In Unity, how can I stop my 3d texts from "glowing" in the dark?

I'm using below shader code, for instance, but the texts turn up much brighter/ self-emissive than other things. Changing to "Lighting On" gets rid of the glow, but will then also get rid of the material color, and turn up black.

How to solve this? Many thanks!

Shader "GUI/3D Text Shader - Cull Back" {
Properties {
    _MainTex ("Font Texture", 2D) = "white" {}
    _Color ("Text Color", Color) = (1,1,1,1)
}

SubShader {
    Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
    Lighting Off Cull Back ZWrite Off Fog { Mode Off }
    Blend SrcAlpha OneMinusSrcAlpha
    Pass {
        Color [_Color]
        SetTexture [_MainTex] {
            combine primary, texture * primary
        }
    }
}
like image 391
Philipp Lenssen Avatar asked Oct 04 '16 09:10

Philipp Lenssen


1 Answers

Copied from comments, added for context:

I suspect the emissive glow is just the material's unlit color contrasting against a dark/variably lit scene? A lit shader could fix such an issue, however Unity's TextMesh component appears to not generate mesh normals and thus the shader's lighting calculations will corrupt (if at all be compiled). It explains why Lighting On outputs black. Without access to TextMesh internals and confined to the limitations of fixed-function shaders, a custom shader may be your only option.

The following is a basic Surface Shader using the Lambert lightning model. Under the hood it will compile to a standard vertex/fragment shader with Unity's lighting calculations automagically injected. It's been written as a drop-in replacement, so simply add it to your project and drag and drop it onto your material:

Shader "GUI/3D Text Shader - Lit"
{
    Properties
    {
        _Color ("Text Color", Color) = (1,1,1,1)
        _MainTex ("Font Texture", 2D) = "white" {}
    }

    SubShader
    {
        Tags {"RenderType"="Transparent" "Queue"="Transparent"}
        Cull Back

        CGPROGRAM   
        #pragma surface SS_Main Lambert vertex:VS_Main alpha:blend 
        #pragma target 3.0

        uniform fixed4 _Color;
        uniform sampler2D _MainTex;

        struct Output
        {
             float4 vertex    : POSITION;
             float3 normal    : NORMAL;     
             float4 texcoord  : TEXCOORD0;
             float4 texcoord1 : TEXCOORD1;
             float4 texcoord2 : TEXCOORD2;
        };

        struct Input
        {
            float2 uv_MainTex;
        };      

        void VS_Main (inout Output o) 
        {          
            // Generate normals for lighting.
            o.normal = float3(0, 0, -1);
        }

        void SS_Main (Input IN, inout SurfaceOutput o)
        {       
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Albedo = _Color.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
}
like image 62
Lece Avatar answered Nov 12 '22 16:11

Lece