【问题标题】:Have 3d text shader be non-emissive?3d 文本着色器是否不发光?
【发布时间】:2018-04-18 01:48:39
【问题描述】:

在 Unity 中,如何阻止我的 3d 文本在黑暗中“发光”?

例如,我正在使用下面的着色器代码,但文本比其他内容更亮/自发光。更改为“Lighting On”会消除发光,但也会消除材质颜色,并变为黑色。

如何解决这个问题?非常感谢!

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
        }
    }
}

【问题讨论】:

  • 不是一个确切的答案,但如果您将其设计为片段着色器而不是使用内置方向docs.unity3d.com/Manual/SL-VertexFragmentShaderExamples.html,您将获得更多控制权
  • 也许我看错了,但是不能从材料的检查员那里调整_Color 属性的亮度吗?
  • 这确实会调整RGB的亮度,但不会调整环境中的发光亮度。以颜色为 rgb(255,0,0) 的文本为例,它是红色;如果我的 3d 场景中绝对没有光源,那么该文本将因此不会显示(因为它是漆黑的)。这适用于任何其他 3d 网格,但另一方面,字体现在将有效地“在黑暗中发光”。 (颜色越不亮,发光就越少,但问题仍然存在。)
  • 我怀疑emissive glow 只是材质的unlit 颜色与黑暗/可变光照场景形成对比?光照着色器可以解决这样的问题,但是 Unity 的 TextMesh 组件似乎不会生成网格法线,因此着色器的光照计算会损坏(如果完全编译的话)。它解释了为什么Lighting On 输出黑色。如果无法访问TextMesh 内部结构并受限于固定功能着色器的限制,自定义着色器可能是您唯一的选择。如果你愿意,我可以发一个来测试一下?
  • 没错,“发光”基本上就是屏幕上显示的那种颜色的完美 RGB,就好像它不受环境或 3D 渲染的影响,因此看起来很闪亮。是的,很高兴测试您可能拥有的任何着色器!

标签: unity3d shader


【解决方案1】:

从 cmets 复制,为上下文添加:

我怀疑自发光只是材质的未点亮颜色与黑暗/可变照明场景形成对比?光照着色器可以解决这样的问题,但是 Unity 的 TextMesh 组件似乎不会生成网格法线,因此着色器的光照计算会损坏(如果有的话)。它解释了为什么Lighting On 输出黑色。如果无法访问 TextMesh 内部并受限于固定功能着色器的限制,自定义着色器可能是您唯一的选择。

以下是使用 Lambert 闪电模型的基本 Surface Shader。在引擎盖下,它将编译为标准的顶点/片段着色器,并自动注入 Unity 的光照计算。它被编写为直接替换,因此只需将其添加到您的项目中并将其拖放到您的材料上:

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
    }
}

【讨论】:

  • 所有工作现在并标记为答案,非常感谢您的帮助! VR 沙盒宇宙 Anyland 将不胜感激!
  • @PhilippLenssen 非常好,不客气!祝你的项目好运:)
猜你喜欢
  • 1970-01-01
  • 2012-09-17
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
相关资源
最近更新 更多