美文网首页
后处理之泛光效果

后处理之泛光效果

作者: APP4x | 来源:发表于2020-09-07 11:01 被阅读0次
这是我在《游戏架构-核心技术与面试精粹》看的,记录一下~

全屏泛光(Bloom)
是一种在实际项目中常用的技术,模拟强光下的效果

技术上并不复杂
在模糊后的渲染结果基础上,再叠加原场景效果

注意:
虽然是全屏泛光,但在实现时还是要限制泛光区域,否则就会过亮
一般的做法是通过阈值的颜色控制
当颜色设置大于阈值的颜色,才被认为是有效颜色,而只有有效颜色才可以计入模糊的采样色中


Shader "Custom/Bloom"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _BlurRadius ("_BlurRadius", Range(1, 20)) = 5
        _BloomFactor ("_BloomFactor", Range(0, 1)) = 0.5
        _ColorThreshold ("_ColorThreshold", Color) = (0.5, 0.5, 0.5, 1)
        _TextureSizeX ("_TextureSizeX", Float) = 256
        _TextureSizeY ("_TextureSizeY", Float) = 256
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            int _BlurRadius;
            float _TextureSizeX;
            float _TextureSizeY;
            float _BloomFactor;
            fixed4 _ColorThreshold;
            
            fixed4 BlurTextrue(float2 uv, float blurRadius, float textureSizeX, float textureSizeY)
            {
                float pixedDisX = 1.0 / textureSizeX;//像素间距X
                float pixedDisY = 1.0 / textureSizeY;//像素间距Y
                int count = blurRadius * 2 + 1;//每行的像素数量
                count *= count;//总格子数

                float4 tmpColor = float4(0, 0, 0, 0);
                for (int x = -blurRadius; x <= blurRadius ; x++)
                {
                    for (int y = -blurRadius; y <= blurRadius ; y++)
                    {
                       float4 color = tex2D( _MainTex, uv + float2(x * pixedDisX, y * pixedDisY));
                       color = saturate(color - _ColorThreshold);
                       tmpColor += color;
                    }
                }
                return tmpColor / count;
            }

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 orgColor = tex2D(_MainTex, i.uv);
                fixed4 blurColor = BlurTextrue(i.uv, _BlurRadius, _TextureSizeX, _TextureSizeY);
                fixed4 final = orgColor + blurColor * _BloomFactor;
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return final;
            }
            ENDCG
        }
    }
}

相关文章

  • 后处理之泛光效果

    这是我在《游戏架构-核心技术与面试精粹》看的,记录一下~ 全屏泛光(Bloom)是一种在实际项目中常用的技术,模拟...

  • [全屏后处理]Bloom泛光

    前言 1.计算机硬件 Unity中颜色值的范围是[0, 255],也就是说, 无论是亮度还是暗度都有个限定值,而这...

  • 屏幕泛光效果

    谈谈自己的理解吧 第一次听说HDR是在我的宾得单反相机上,有个HDR的拍摄模式,叫做高动态范围拍摄,其原理是拍摄一...

  • 后处理之辉光效果

    这是我在《游戏架构-核心技术与面试精粹》看的,记录一下~ 泛光和辉光不一样么?那是肯定的 辉光(Glow):是全屏...

  • 后处理之模糊效果

    这是我在《游戏架构-核心技术与面试精粹》看的,记录一下~ 模糊原理:当颜色的边缘不清楚时,就会呈现出模糊效果核心就...

  • Ⅶ屏幕后处理效果

    屏幕后处理效果 屏幕后处理效果(screen post - processing effects)是游戏中实现屏幕...

  • 【Unity Shader入门精要学习】高级(一)

    屏幕后处理效果 屏幕后处理效果(screen post-processing effects),是游戏中实现屏幕特...

  • UGUI背景模糊解决方案总结

    一、图形效果处理流程 实现UGUI的背景模糊,其实也就是实现一种后处理效果,牵扯到后处理效果的,基本都需要在OnR...

  • 高质量泛光(Bloom)从理论到实战

    泛光(Bloom)是现代电子游戏中常见的后处理特效,通过图像处理算法将画面中高亮的像素向外“扩张”形成光晕以增加画...

  • Cesium实现UnrealBloom泛光效果

    泛光(Bloom)是一种常用的后期处理特效,游戏中更是随处可见,这里直接上我们的效果图。 Cesium内置的blo...

网友评论

      本文标题:后处理之泛光效果

      本文链接:https://www.haomeiwen.com/subject/xmrtektx.html