• Unity学习之Shader


    Shader

    是用来实现图像渲染的,用来替代固定渲染管线的可编辑程序。其中Vertex Shader(顶点着色器)主要负责顶点的几何关系等的运算,Pixel Shader(像素着色器)主要负责片元颜色等的计算。顶点Shader负责改变形态,像素Shader负责改变颜色。

    Unity中的Shader类型

    Standard Surface Shader 

    标准表面着色器,它是一种基于物理的着色系统,可以理解为 它是通过对物理现象的简单模拟,可以实现生活中各种物品的效果,比如石头、木材、玻璃、塑料和金属等等。

    Unlit Shader

    它是最简单的着色器,与 Standard Surface Shader 相比,它去除了冗长的光照公式以及阴影解算,因此得名 Unlit,翻译过来就是无光照,也正因如此,它只由最基础的 Vertex Shader 和 Fragment Shader 组成

    Image Effect Shader

    它其实也是顶点片元着色器,不过它主要针对实现各种屏幕后处理效果,那后处理是什么呢?一般像是泛光、调色、景深、模糊等基于最终整个屏幕画面而进行再次处理的就是后处理。

    Compute Shader

    计算着色器,它是在GPU中运行的一段程序,独立于常规渲染管线之外的,它可以直接将GPU作为并行处理器加以利用,从而使GPU不仅具有3D渲染能力,还具有其他的运算能力。一般会在需要大量并行计算的时候使用。

    Ray Tracing Shader

    光线追踪着色器,光线追踪是指从摄像机出发的若干条光线,每条光线会和场景里的物体求交,根据交点位置获取表面的材质、纹理等信息,并结合光源信息计算光照。相对于传统的光栅化渲染,光线追踪可以轻松模拟各种光学效果,如反射、折射、散射、色散等。但由于在进行求交计算时需要知道整个场景的信息,它的计算成本也是非常高的。

    ShaderLab

    Unity为我们封装的着色器语言,而目前主流的着色器语言有3种,基于OpenGL的GLSL / 基于DX的HLSL / NVIDIA公司的CG。而ShaderLab则是Unity在HLSL和CG的基础之上封装的只属于Unity的着色器语言,它的灵活性更高,而且不再需要将 Shader 的配置 硬写在引擎代码中,本质是在底层着色语言的基础上,额外提供了声明信息,以数据驱动的方式使我们在渲染管线内自由发挥。

    ShaderLab语法详细解析

    1. // Shader 的路径名称 默认为文件名,也可以与文件名不同
    2. Shader "Unlit/HiShader"
    3. {
    4. // 属性
    5. // Material Inspector显示的所有参数都在需要在这里进行声明
    6. Properties
    7. {
    8. // 通常所有属性名都以下划线字符开头 _MainTex
    9. _MainTex ("Texture", 2D) = "white" {}
    10. // 比较常见的属性类型
    11. // ————————————————————————————————————————————————
    12. _Integer ("整数(新版)", Integer) = 1
    13. _Int ("整数(旧版)", Int) = 1
    14. _Float ("浮点数", Float) = 0.5
    15. _FloatRange ("浮点数滑动条", Range(0.0, 1.0)) = 0.5
    16. // Unity包含以下内置纹理, 可以直接填充
    17. // “white”(RGBA:1,1,1,1
    18. // “black”(RGBA:0,0,0,1
    19. // “gray”(RGBA:0.5,0.5,0.5,1
    20. // “bump”(RGBA:0.5,0.5,1,0.5
    21. // “red”(RGBA:1,0,0,1
    22. _Texture2D ("2D纹理贴图", 2D) = "red" {}
    23. // 字符串留空或输入无效值,则它默认为 “gray”
    24. _DefaultTexture2D ("2D纹理贴图", 2D) = "" {}
    25. // 默认值为 “gray”(RGBA:0.5,0.5,0.5,1
    26. _Texture3D ("3D纹理贴图", 3D) = "" {}
    27. _Cubemap ("立方体贴图", Cube) = "" {}
    28. // Inspector会显示四个单独的浮点数字段
    29. _Vector ("Example vector", Vector) = (0.25, 0.5, 0.5, 1)
    30. // Inspector会显示拾色器拾取色彩RGBA值
    31. _Color("色彩", Color) = (0.25, 0.5, 0.5, 1)
    32. // ————————————————————————————————————————————————
    33. // 除此之外 属性声明还可以具有一个可选特性 用来告知Unity如何处理它们
    34. // HDR可以使色彩亮度的值超过1
    35. [HDR]_HDRColor("HDR色彩", Color) = (1,1,1,1)
    36. // Inspector隐藏此属性
    37. [HideInInspector]_Hide("看不见我~", Color) = (1,1,1,1)
    38. // Inspector隐藏此纹理属性的Scale Offset字段
    39. [NoScaleOffset]_HideScaleOffset("隐藏ScaleOffset", 2D) = "" {}
    40. // 指示纹理属性为法线贴图,如果分配了不兼容的纹理,编辑器则会显示警告。
    41. [Normal]_Normal("法线贴图", 2D) = "" {}
    42. }
    43. // 子着色器
    44. // 一个Shader至少有一个或者多个子着色器SubShader,这些子着色器互不干扰,且只有一个会运行
    45. // 在加载shader时Unity会遍历所有SubShader列表,并最终选择用户机器支持的第一个
    46. SubShader
    47. {
    48. // 可以通过Tags来向子着色器分配标签
    49. // 只可以写在SubShader语块内,不可写在Pass内
    50. /* 以键值对的形式存在,可以出现多个键值对
    51. Tags {
    52. "TagName1" = "Value1"
    53. "TagName2" = "Value2"
    54. "TagName3" = "Value3"
    55. ...
    56. }
    57. */
    58. // RenderPipeline: 声明子着色器是否与通用渲染管线 (URP) 或高清渲染管线 (HDRP) 兼容
    59. // 仅与 URP 兼容
    60. // Tags { "RenderPipeline"="UniversalRenderPipeline" }
    61. // 仅与 HDRP 兼容
    62. // Tags { "RenderPipeline"="HighDefinitionRenderPipeline" }
    63. // RenderPipeline不声明或任何其他值表示与 URP 和 HDRP 不兼容
    64. // ————————————————————————————————————————————————
    65. // Queue: 声明渲染队列
    66. // Tags { "Queue"="Background" } // 最早被调用的渲染,用来渲染天空盒或者背景
    67. // Tags { "Queue"="Geometry" } // 这是默认值,用来渲染非透明物体(普通情况下,场景中的绝大多数物体应该是非透明的)
    68. // Tags { "Queue"="AlphaTest" } // 用来渲染经过Alpha Test的像素,单独为AlphaTest设定一个Queue是出于对效率的考虑
    69. // Tags { "Queue"="Transparent" }// 以从后往前的顺序渲染透明物体
    70. // Tags { "Queue"="Overlay" } // 用来渲染叠加的效果,是渲染的最后阶段(比如镜头光晕等特效)
    71. // ————————————————————————————————————————————————
    72. // RenderType: 用来区别这个Shader要渲染的对象是属于什么类别的。
    73. // 设置渲染类型 用一种称为着色器替换的技术在运行时交换子着色器,用来区别这个Shader要渲染的对象是属于什么类别的
    74. // 这里表示非透明物体渲染
    75. Tags { "RenderType"="Opaque" }
  • 相关阅读:
    倒排索引:ES倒排索引底层原理及FST算法的实现过程
    单细胞聚类,究竟聚类聚成多少类比较合适?全代码分享
    每个开发人员都应该关注的7个优秀的GitHub仓库
    SpringCore完整学习教程5,入门级别
    uni-app接入mPaas扫码
    分类问题经典算法 | 多分类问题 | Softmax回归:梯度下降
    理论篇2:深度学习之----优化器(1)
    量子点表面修饰PEG/抗体/金属/细胞膜/无机材料标记与制备
    教你 Java 注解与反射
    Golang结构体按某一成员变量排序
  • 原文地址:https://blog.csdn.net/liu_xueping/article/details/127909153