Unity学习之Shader

Unity学习之ShaderShader 是用来实现图像渲染的 用来替代固定渲染管线的可编辑程序 其中 Vertex Shader 顶点着色器 主要负责顶点的几何关系等的运算 Pixel Shader 像素着色器 主要负责片元颜色等的计算 顶点 Shader 负责改变形态 像素 Shader 负责改变颜色 Unity 中的 Shader 类型 Standard Surface 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语法详细解析

// Shader 的路径名称 默认为文件名,也可以与文件名不同 Shader "Unlit/HiShader" { // 属性 // Material Inspector显示的所有参数都在需要在这里进行声明 Properties { // 通常所有属性名都以下划线字符开头 _MainTex _MainTex ("Texture", 2D) = "white" {} // 比较常见的属性类型 // ———————————————————————————————————————————————— _Integer ("整数(新版)", Integer) = 1 _Int ("整数(旧版)", Int) = 1 _Float ("浮点数", Float) = 0.5 _FloatRange ("浮点数滑动条", Range(0.0, 1.0)) = 0.5 // Unity包含以下内置纹理, 可以直接填充 // “white”(RGBA:1,1,1,1) // “black”(RGBA:0,0,0,1) // “gray”(RGBA:0.5,0.5,0.5,1) // “bump”(RGBA:0.5,0.5,1,0.5) // “red”(RGBA:1,0,0,1) _Texture2D ("2D纹理贴图", 2D) = "red" {} // 字符串留空或输入无效值,则它默认为 “gray” _DefaultTexture2D ("2D纹理贴图", 2D) = "" {} // 默认值为 “gray”(RGBA:0.5,0.5,0.5,1) _Texture3D ("3D纹理贴图", 3D) = "" {} _Cubemap ("立方体贴图", Cube) = "" {} // Inspector会显示四个单独的浮点数字段 _Vector ("Example vector", Vector) = (0.25, 0.5, 0.5, 1) // Inspector会显示拾色器拾取色彩RGBA值 _Color("色彩", Color) = (0.25, 0.5, 0.5, 1) // ———————————————————————————————————————————————— // 除此之外 属性声明还可以具有一个可选特性 用来告知Unity如何处理它们 // HDR可以使色彩亮度的值超过1 [HDR]_HDRColor("HDR色彩", Color) = (1,1,1,1) // Inspector隐藏此属性 [HideInInspector]_Hide("看不见我~", Color) = (1,1,1,1) // Inspector隐藏此纹理属性的Scale Offset字段 [NoScaleOffset]_HideScaleOffset("隐藏ScaleOffset", 2D) = "" {} // 指示纹理属性为法线贴图,如果分配了不兼容的纹理,编辑器则会显示警告。 [Normal]_Normal("法线贴图", 2D) = "" {} } // 子着色器 // 一个Shader至少有一个或者多个子着色器SubShader,这些子着色器互不干扰,且只有一个会运行 // 在加载shader时Unity会遍历所有SubShader列表,并最终选择用户机器支持的第一个 SubShader { // 可以通过Tags来向子着色器分配标签 // 只可以写在SubShader语块内,不可写在Pass内 /* 以键值对的形式存在,可以出现多个键值对 Tags { "TagName1" = "Value1" "TagName2" = "Value2" "TagName3" = "Value3" ... } */ // RenderPipeline: 声明子着色器是否与通用渲染管线 (URP) 或高清渲染管线 (HDRP) 兼容 // 仅与 URP 兼容 // Tags { "RenderPipeline"="UniversalRenderPipeline" } // 仅与 HDRP 兼容 // Tags { "RenderPipeline"="HighDefinitionRenderPipeline" } // RenderPipeline不声明或任何其他值表示与 URP 和 HDRP 不兼容 // ———————————————————————————————————————————————— // Queue: 声明渲染队列 // Tags { "Queue"="Background" } // 最早被调用的渲染,用来渲染天空盒或者背景 // Tags { "Queue"="Geometry" } // 这是默认值,用来渲染非透明物体(普通情况下,场景中的绝大多数物体应该是非透明的) // Tags { "Queue"="AlphaTest" } // 用来渲染经过Alpha Test的像素,单独为AlphaTest设定一个Queue是出于对效率的考虑 // Tags { "Queue"="Transparent" }// 以从后往前的顺序渲染透明物体 // Tags { "Queue"="Overlay" } // 用来渲染叠加的效果,是渲染的最后阶段(比如镜头光晕等特效) // ———————————————————————————————————————————————— // RenderType: 用来区别这个Shader要渲染的对象是属于什么类别的。 // 设置渲染类型 用一种称为着色器替换的技术在运行时交换子着色器,用来区别这个Shader要渲染的对象是属于什么类别的 // 这里表示非透明物体渲染 Tags { "RenderType"="Opaque" } 

讯享网
小讯
上一篇 2025-01-19 16:00
下一篇 2025-02-26 11:26

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/47317.html