将发光效果(Bloom)添加到着色器中(Unity游戏引擎)

7

我正在使用Unity游戏引擎创建iOS应用程序

我试图重写我的着色器,以使使用它的材质具有泛光效果(类似于Halo组件)。

以下是所需效果的示例

Bloom (Glow) effect

enter image description here

我在互联网上搜索了答案,但没有找到适合解决我的问题的工作人员或合适的解决方案。

我的着色器代码

Shader "Unlit"
{ 
    Properties
    {
        _MainTex("Base (RGB) Trans (A)", 2D) = "white" {}
        _Color("Main Color", Color) = (1, 1, 1, 1) 
    }
    SubShader
    {
        Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }
        LOD 100 
        Cull off
        ZWrite on 
        Blend SrcAlpha OneMinusSrcAlpha
        Pass 
        { 
            Lighting Off
            SetTexture[_MainTex]
            {
                constantColor[_Color]
                Combine texture * constant, texture * constant 
            }
        } 
    } 
}

1
发光和因此开花量来自最终像素颜色值的价值,通常应该在HDR范围内。尝试添加一个发射属性,例如_Emission(“发射强度”,范围(0.01,3.0))= 1.0。然后将输出乘以此属性。 - Absinthe
很遗憾,我认为这并不简单。您目前正在使用着色器程序。要操作发射,您需要将着色器重写为表面着色器,而不是使用程序。请参阅手册中的此处 https://docs.unity3d.com/Manual/SL-SurfaceShaderExamples.html 并查找“emission”,那里有许多示例。话虽如此,我对此还比较新,并欢迎其他评论。 - Absinthe
你正在使用Bloom效果脚本吗? - Emilio Martinez
我需要在我的着色器(问题中)中添加泛光效果(就像屏幕截图上的那样)。 - ARTAGE
我不需要用脚本实现花开效果,而是需要一个着色器,使得使用该着色器的材质可以具有Bloom(Glow)效果(类似光晕组件)。 - ARTAGE
显示剩余2条评论
1个回答

14

一个着色器程序只是用来在屏幕上画三角形的代码。Bloom效果是完全不同的东西,是在几何图形绘制之后进行的屏幕空间计算。仅仅修改物体的着色器是无法获得Bloom效果的。

简单地说,使用着色器永远不能在“边界”之外绘制内容。而这里你需要改变超出物体范围的像素。很遗憾,这并不在着色器的能力范围之内。

但是,你可以通过实现图像效果脚本来使其正常工作,比如Unity的内置Bloom效果。一旦将脚本添加到相机中,并激活相机的HDR设置,就可以使用特殊的着色器产生发光效果,但前提是先做好这些步骤。

一旦正确设置了效果(并在相机上启用了HDR选项),现在就可以使用任何像素着色器中返回值大于1的着色器程序来生成物体周围的发光效果。你所贴出的着色器程序是一个旧的着色器程序。这里是更新后的代码,包括Glow乘数:

Shader "Glow" {
    Properties {
        _MainTex ("Texture", 2D) = "white" {}
        _Color ("Color", Color) = (1,1,1,1)
        _Glow ("Intensity", Range(0, 3)) = 1
    }
    SubShader {
        Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }
        LOD 100
        Cull Off
        ZWrite On
        Blend SrcAlpha OneMinusSrcAlpha

        Pass {
            CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag

                sampler2D _MainTex;
                half4 _MainTex_ST;
                fixed4 _Color;
                half _Glow;

                struct vertIn {
                    float4 pos : POSITION;
                    half2 tex : TEXCOORD0;
                };

                struct v2f {
                    float4 pos : SV_POSITION;
                    half2 tex : TEXCOORD0;
                };

                v2f vert (vertIn v) {
                    v2f o;
                    o.pos = mul(UNITY_MATRIX_MVP, v.pos);
                    o.tex = v.tex * _MainTex_ST.xy + _MainTex_ST.zw;
                    return o;
                }

                fixed4 frag (v2f f) : SV_Target {
                    fixed4 col = tex2D(_MainTex, f.tex);
                    col *= _Color;
                    col *= _Glow;
                    return col;
                }
            ENDCG
        }
    }
}

Unity选择性逐物体泛光 - https://m.youtube.com/watch?v=XJ0tMHDrzDo。我该如何使用我的着色器创建类似的效果? - ARTAGE
1
通过使用类似于视频中使用的摄像机脚本。在2:16查看摄像机检查器。 - Emilio Martinez
1
我只是在颜色输出中添加了一个乘数。如果使用Bloom脚本,这将使发光效果起作用。不过,这是一个带有ZWrite On的透明着色器,有时可能会得到意外的结果,这有点奇怪。 - Emilio Martinez
1
可以的。这是它的工作原理:效果会影响相机,使用此着色器绘制的任何内容都将被放大。如果您只想要一个带有bloom的对象,则只在一个对象中使用此着色器即可。 - Emilio Martinez
1
你解决了我的问题。谢谢你! - ARTAGE
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接