Unity3d 中的 HDR_BLOOM

虽然u3d标准资源包自带这货,但是我就喜欢重复造轮子,你奈我何

unity3d_hdr_bloom

简单来说 hdr_bloom 就3个Shader
第一个是shader, 筛选出像素亮度
第二个shader, 对像素进行模糊
第三个shader, 合并原始纹理 + 模糊亮度的纹理

第一个Shader
筛选亮度的算法

float brightness = col.r * 0.299 + col.g * 0.587 + col.b * 0.114;

之后我们给 Shader 一个 uniform 参数,作为亮度的调节参数即可

之后,为了让亮度周围出现光晕,我们将亮度纹理绘制在一张特别小的纹理上,然后再将这张小纹理进行拉伸,使其出现像素马赛克效果,这样处理后,迈赛克的亮度部分就会比原始纹理的明亮部分范围更大了,初步的光晕范围就出来了。
但是这部分光晕因为是马赛克,于是要将其进行模糊处理

绘制到缩小纹理再拉伸的效果是这样的

unity3d_hdr_bloom_2

继续阅读“Unity3d 中的 HDR_BLOOM”

让我们来创建后期效果-高动态光照渲染!

先放2张图
第1张是没有HDR效果的。
cryb

第2张是HDR效果的
crya

这个效果原本是GLSL的Shader. 我先移植到 Pixel Bender 上验证自己的理解没有错后,再移植到AGAL上,最后和之前的Blur效果融合。

这是Pixel Bender 的代码

<languageversion : 1.0;>

kernel Lum
< namespace : "cn.dreamfairy";
    vendor : "dreamfairy";
    version : 1;
>
{
    input image4 baseTex;
    input image4 bloomTex;
    output pixel4 dsts;
   
    //外部参数
   parameter float fAvgLum
    < minValue:float(0.1);
        maxValue:float(0.5);
        defaultValue:float(0.5);
    >;

    parameter float fDimmer
    < minValue:float(0);
        maxValue:float(1);
        defaultValue:float(1);
    >;

    void
    evaluatePixel()
    {
        float4 texCol = sampleNearest(baseTex,outCoord());
        //计算平均亮度
        float vLum = 0.27 * texCol.r + 0.67 * texCol.g + 0.06 * texCol.b;
        //亮度缩放
        float vLumScaled = fDimmer * vLum / fAvgLum;
       
        texCol = float4(texCol.r * vLumScaled, texCol.g * vLumScaled,
        texCol.b * vLumScaled, texCol.a * vLumScaled);
        texCol = texCol / (float4(1.0) + texCol);
       
        float4 texBloom = sampleNearest(bloomTex, outCoord());        
        dsts = texBloom + texCol;
    }
}

继续阅读“让我们来创建后期效果-高动态光照渲染!”