【浅墨Unity3D Shader编程】之十一 深入理解Unity5中的Standard Shader(三)屏幕像素化

本系列文章由@浅墨_毛星云出品,转载请注明出处。文章链接:作者:毛星云(浅墨) 微博:本文工程使用的Unity3D版本:5.2.1概要:续接上文,本文进一步讲解与分析了上文未讲完的Unity5中Standard Shader正向基础渲染通道源码的片段着色实现部分,以及对屏幕像素化后期特效进行了实现。同样需要声明的是。本文中对Stardard Shader源码的一些分析,全是浅墨自己通过对Unity Shader内建源码的理解,以及Google之后理解与分析而来。如有解释不妥当之处,还请各位及时指出。

依然是附上一组本文配套工程的运行截图之后,便开始我们的正文。

傍晚的野外(with 屏幕像素化特效):

傍晚的野外(原始场景):

图依然是贴这两张。文章末尾有更多的运行截图,并提供了源工程的下载。先放出可运行的exe下载,如下:【可运行的本文配套exe游戏场景请点击这里下载】提示:在此游戏场景中按F键可以开关屏幕特效。一、关于BRDF(双向反射分布函数)本次源码剖析有涉及BRDF的相关内容,这边简单提一下。双向反射分布函数(Bidirectional ReflectanceDistribution Function,BRDF)用来定义给定入射方向上的辐射照度(irradiance)如何影响给定出射方向上的辐射率(radiance)。更笼统地说,它描述了入射光线经过某个表面反射后如何在各个出射方向上分布——这可以是从理想镜面反射到漫反射、各向同性(isotropic)或者各向异性(anisotropic)的各种反射。BRDF作为图形学中比较常见的一个知识点,这边暂时不多讲,因为随便拿一本图形学相关的书都可以看到他的身影。这边给出一些参考的链接,大家有需要可以深入了解:1. 如何正确理解 BRDF (双向反射分布函数)? – 计算机 – 知乎2.图形学理论知识:BRDF 双向反射分布函数3. An Introduction to BRDF-based Lighting –Nvidia

二、续Standard Shader中正向基础渲染通道源码分析

此部分接上文《【浅墨Unity3D Shader编程】之十 深入理解Unity5中的Standard Shader(二)&屏幕油画特效的实现》的第二部分“Standard Shader中正向基础渲染通道源码分析“。

上文中分析了Standard Shader中正向基础渲染通道的源码,刚好分析完了顶点着色函数vertForwardBase,本文中将对片段着色函数fragForwardBase 进行说明。分析完之后,也就结束了这一系列长得稍微有些离谱的Standard Shader正向基础渲染通道的源码分析。

OK,开始吧,先上注释好的片段着色函数fragForwardBase的代码,位于UnityStandardCore.cginc中:

//—————————————-【fragForwardBase函数】——————————————-// 用途:正向渲染基础通道的片段着色函数// 输入:VertexOutputForwardBase结构体// 输出:一个half4类型的颜色值//——————————————————————————————————————half4 fragForwardBase (VertexOutputForwardBase i) : SV_Target{//定义并初始化类型为FragmentCommonData的变量sFRAGMENT_SETUP(s)//若定义了UNITY_OPTIMIZE_TEXCUBELOD,则由输入的顶点参数来设置反射光方向向量#if UNITY_OPTIMIZE_TEXCUBELODs.reflUVW= i.reflUVW;#endif//设置主光照UnityLight mainLight = MainLight (s.normalWorld);//设置阴影的衰减系数half atten = SHADOW_ATTENUATION(i);//计算全局光照half occlusion = Occlusion(i.tex.xy);UnityGI gi = FragmentGI (s, occlusion, i.ambientOrLightmapUV, atten, mainLight);//加上BRDF-基于物理的光照half4 c = UNITY_BRDF_PBS (s.diffColor, s.specColor, s.oneMinusReflectivity, s.oneMinusRoughness, s.normalWorld, -s.eyeVec, gi.light, gi.indirect);//加上BRDF-全局光照c.rgb += UNITY_BRDF_GI (s.diffColor, s.specColor, s.oneMinusReflectivity, s.oneMinusRoughness, s.normalWorld, -s.eyeVec, occlusion, gi);//加上自发光c.rgb += Emission(i.tex.xy);//设置雾效UNITY_APPLY_FOG(i.fogCoord, c.rgb);//返回最终的颜色return OutputForward (c, s.alpha);}依然是老规矩,把上面代码中新接触到的相关内容进行下分条讲解。

接受失败也等于给了自己从零开始的机会,接受失败更是一种智者的宣言和呐喊;

【浅墨Unity3D Shader编程】之十一 深入理解Unity5中的Standard Shader(三)屏幕像素化

相关文章:

你感兴趣的文章:

标签云: