• Shader入门精要笔记-屏幕后处理效果(1)


    目录

    一.Unity提供的接口:OnRenderImage函数(该脚本必须挂载到有相机组件的游戏对象上)

    二.在OnRenderImage中利用Graphics.Blit函数完成对渲染处理的处理

    三.屏幕后处理效果的过程如下:


    屏幕后处理:指的是在渲染完整个场景得到屏幕图形后,对图形进行一系列操作,实现各种屏幕特效

    如:景深,运动模糊

    基础在于:得到渲染后的屏幕图像,即抓取屏幕

    一.Unity提供的接口:OnRenderImage函数(该脚本必须挂载到有相机组件的游戏对象上)

    MonoBehaviour.OnRenderImage(RenderTexture src,Render Texture dest);

    --该函数允许我们使用着色器滤波操作来修改最终的图像,输入原图像source,输出的图像放在desitination里。

    二.在OnRenderImage中利用Graphics.Blit函数完成对渲染处理的处理

    Graphics.Blit:通过一个shader将原图的像素放置到destionation中

    1. public static void Blit(Texture src,RenderTexture dest);
    2. public static void Blit(Texture src,RenderTexture dest,Material mat,int pass=-1);
    3. public static void Blit(Texture src,Material mat,int pass=-1);

    src(源纹理):当前屏幕的渲染纹理(或者上一步处理后得到的渲染纹理)src纹理将会被传递给shader中名为_MainTex的纹理属性。

    dest(目标渲染纹理):为空就直接将结果显示到屏幕上

    mat(后处理的材质):这个材质使用的unity shader将会进行各种屏幕后处理操作。

    pass:默认值为-1,表示将会依次调用shader内的所有Pass。否则只会调用给定索引的Pass

    三.屏幕后处理效果的过程如下:

    1.首先需要检查当前平台是否支持渲染纹理和屏幕特效,是否支持unityShader等。

    2.通过OnRenderImage函数来获取到的当前屏幕的渲染纹理,再调用Graphics.Blit函数使用特定的UnityShader来对当前图形进行处理

    3.Shader的_MainTex即为OnRenderImage函数来获取到的当前屏幕的渲染纹理,在frag函数里对图像进行逐像素处理后再返回给OnRenderImage函数,得到最后的屏幕画面。

    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. [ExecuteInEditMode]//可以让代码在编辑模式下也能运行
    5. //屏幕后处理的效果都需要绑定在某个摄像机上
    6. [RequireComponent( typeof(Camera))]//当我们把一个Script绑定到GameObject上时会同时把需要依赖的脚本也一起绑定上去
    7. public class PostEffectsBase : MonoBehaviour
    8. {
    9. protected void CheckResources()
    10. {
    11. bool isSupported = CheckSupport();
    12. if (isSupported==false)
    13. {
    14. NotSupported();
    15. }
    16. }
    17. protected bool CheckSupport()
    18. {
    19. if (SystemInfo.supportsImageEffects==false||SystemInfo.supportsRenderTextures==false)
    20. {
    21. Debug.LogWarning("This platform does not support image effects or render textures.");
    22. return false;
    23. }
    24. return true;
    25. }
    26. protected void NotSupported()
    27. {
    28. enabled = false;
    29. }
    30. protected void Start()
    31. {
    32. CheckResources();
    33. }
    34. ///
    35. /// 检查shader的使用性,检查通过后就返回一个使用该shader的材质,否则返回null
    36. ///
    37. /// 指定该特效需要使用的Shader
    38. /// 用于后期处理的材质
    39. ///
    40. protected Material CheckShaderAndCreateMaterial(Shader shader, Material material
    41. )
    42. {
    43. if (shader==null)
    44. {
    45. return null;
    46. }
    47. if (shader.isSupported&&material&&material.shader==shader)
    48. {
    49. return material;
    50. }
    51. if (!shader.isSupported)
    52. {
    53. return null;
    54. }
    55. else
    56. {
    57. material=new Material(shader);
    58. material.hideFlags = HideFlags.DontSave;
    59. if (material)
    60. return material;
    61. else
    62. {
    63. return null;
    64. }
    65. }
    66. }
    67. }

  • 相关阅读:
    前端开发中如何高效渲染大数据量
    JS 模块化 - 03 AMD 规范与 Require JS
    潜匿的怪物,你的供应链真的安全吗?
    Mysql之锁与事务
    CSS 还原拉斯维加斯球数字动画
    Spring源码:Bean生命周期(三)
    中英文说明书丨艾美捷T7 RNA聚合酶介绍
    at编译环境搭建-win
    如何使用家庭网络运行Aleo Prover
    Hadoop部署过程中问题总结
  • 原文地址:https://blog.csdn.net/muziiii/article/details/126571171