【问题标题】:Adding bloom (glow) effect to shader (Unity game engine)为着色器添加绽放(发光)效果(Unity 游戏引擎)
【发布时间】:2016-07-23 12:43:32
【问题描述】:

我正在 Unity game engine 中创建 iOS 应用

我正在尝试重写我的 着色器,以便使用它的 材质 >绽放(发光)效果(像Halo component)。

一个示例它的外观:

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

我的着色器的代码

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

【问题讨论】:

  • Emission,因此绽放量来自最终像素颜色值的值,该值通常应在 HDR 范围内。尝试添加发射属性,例如_Emission("发射强度", Range(0.01,3.0)) = 1.0。然后将你的输出乘以这个属性。
  • 你能告诉我应该如何在我添加到问题的着色器女巫中完成吗?
  • 不幸的是,我认为事情没有那么简单。您当前正在使用着色器程序。要操纵发射,您需要将着色器重新编写为表面着色器,而不是使用程序。请参阅手册docs.unity3d.com/Manual/SL-SurfaceShaderExamples.html 中的此处并查找“排放”有很多示例。那就是说我对它还很陌生,并且会欢迎其他 cmets。
  • 你在使用Bloom Effect脚本吗?
  • 我需要添加到我的着色器(有问题)绽放效果(如屏幕截图)。

标签: ios unity3d opengl-es shader unity5


【解决方案1】:

着色器程序只是用于在屏幕上绘制三角形的代码。绽放效果是完全不同的野兽,and are screen-space calculations that are done after the geometry is drawn。仅仅通过修改对象的着色器是不会得到绽放效果的。

简单地说,使用着色器你永远不能在“线外”绘制,在这里你需要改变对象无法触及的像素。很抱歉,但这不在着色器的能力范围内。

不过,您可以通过实现 Image Effect 脚本使其工作,例如 unity 的 built-in bloom effect。将脚本添加到相机并激活相机的 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 选择性每个对象绽放 - m.youtube.com/watch?v=XJ0tMHDrzDo。我如何用我的着色器创建这样的东西?
  • 通过在相机上使用脚本,就像他们在视频中使用的一样。在 2:16 看相机的检查员
  • 我只是在颜色输出中添加了一个乘数。如果使用 Bloom 脚本,这将使发光效果起作用。不过有点奇怪,它是一个透明着色器,带有 ZWrite On,你可能会得到意想不到的结果
  • 是的,你可以。它是这样工作的:效果会影响相机,并且使用此着色器绘制的任何内容都会被渲染。如果您只想要一个具有绽放的对象,则仅在一个对象中使用此着色器
  • 你决定我的问题。谢谢你!
猜你喜欢
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多