【个人学习记录-Unity Shader基础】

Shader

渲染管线

渲染分为3个阶段 应用阶段 几何阶段 光栅化阶段

应用阶段:由CPU处理。把视野外的物体剔除掉,然后设置要渲染的状态(材质纹理、纹理、Shader等),然后把图元(点、线、三角面)装载到显存。

几何阶段:由GPU处理。处理传来的顶点和三角面。这个阶段重要任务就是把模型坐标转换到屏幕坐标。这一阶段会输出屏幕空间的二维顶点坐标、顶点的深度值、颜色等相关属性。

光栅化阶段:由GPU处理。图元所包含的像素进行处理。然后哪些像素要被输出到屏幕上。

顶点数据->顶点着色器->曲面细分->几何处理->裁剪->屏幕映射->三角形设置->三角形遍历->片元着色器->逐片元操作->打印屏幕图像

顶点着色器:可完全编程。最主要的是把模型空间的位置转换到裁剪空间。同时处理顶点颜色。

曲面细分:可完全编程。这个阶段细分图元用的。比如实现LOD效果,加顶点实现更细节的动画,用低模加细分在运行的时候实现高模效果。

几何着色器。是完全可编程的。在顶点着色器阶段我们不能得知顶点和顶点的关系,但是在几何着色器可以。几何着色器主要是添加或者减少图元。

空间变换:模型空间->世界空间->观察空间->裁剪空间->屏幕空间

*HDR和SDR的区别

概念不同,HDR是指高动态范围图像,SDR是指标准动态范围图像;||亮度范围表现不同,HDR比SDR有更大更亮的数据存储;||图像细节表现不同,HDR技术可以在使图像在明暗之间获取更多的细节表现。

*内联函数:

inline Type Name(xxx){
	xxx
}
//用于被频繁调用的函数时,防止函数频繁入栈,造成性能浪费。
顶点片元着色器

代码模板:

 {
   //Hidden 表示此Shader 无法在面板中找到 比如最常见的粉红色ErrorShader 
Properties
   {
     _MainTex ("Texture", 2D) = "white" {}
     _Color ("Color Tint",Color) = (1,1,1,1)
     _Range ("Range",Range(0,10)) = 5
     _Float ("Float",Float) = 4
     _Int ("Int",Int) = 10
     _Vector("Vector",Vector) = (1,2,3,4)
     _Cube ("Cube",Cube) = "white"{}
     _3D ("3D",3D) = "black"{}
   }

//Unity 会扫描所有SubShader语义块,选择第一个可以再目标平台运行的SubShader,假设都不支持,那么会调用Fallback

   {
     //subShader中指定的状态会应用到所有pass
     //SubShader Tags 列表如下 标签设置与Pass中不一样,但语法一致


Tags{"Queue" = "Transparent" "RenderType" = "Opaque"} //多Tags 写法
     //Queue 控制渲染顺序,指定渲染队列
     //Queue 选项如下
     //Background 队列索引号 1000 最先渲染
     //Geometry  队列索引号 2000 默认渲染队列,不透明物体使用这个队列
     //AlphaTest 队列索引号 2450 需要透明度测试的使用这个队列 
     //Transparent队列索引号 3000 任何使用了透明度混合(例如关闭了深度写入的Shader)
     //Overlay  队列索引号 4000 可实现叠加效果 任何在需要在最后渲染的物体都需要使用该队列

//RenderType 对着色器进行分类 可以用于着色器替换功能
     //RenderType 选项如下
     //Opaque 渲染不透明物体时使用
     //Transparnet 渲染透明物体使用

//DisableBatching 指明是否对该SubShader使用批处理 true | false

//ForceNoShadowCasting 该SubShader 是否会投射阴影 true | false

//IgnoreProjector 是否忽略阴影 true | false 

//CanUseSpriteAtlas 当该SubShader 是用于Sprites 时, 将该标签设为false

//PreviewType 指明材质面板如何预览该材质 默认情况下,材质将显示为一个球形 Plane | SkyBox

//[RenderSetUp]
     //设置剔除模式 Back 背面 Front正面 Off关闭
     Cull Off 

//设置深度测试时 使用的函数
     //Less Greater | LEqual | GEqual | Equal | NotEqual | Always
     ZTest Less Greater

//深度写入 On | Off 打开 | 关闭
     ZWrite On

//混合 开启并设置
     Blend SrcAlpha OneMinusSrcAlpha
     //Blend 混合选项
     //Blend Off 关闭混合
     //Blend SrcFactor DstFactor 开启混合并设置混合因子 最终颜色 = 源颜色(该片元产生的颜色)* SrcFactor + 目标颜色(已经存在与颜色缓冲区的颜色)* DstFactor
     //Blend SrcFactor DstFactor,ScrFactorA DstFactorA 与上面一致,只是Alpha通道使用不同的因子来混合
     //BlendOp BlendOperation 混合操作命令

//混合因子
     //One    因子为1
     //Zero   因子为0
     //SrcColor 因子为源颜色值 混合RGB时 以源颜色RGB分量为因子 混合A时 以源颜色A分量为因子
     //SrcAlpha 因子为源颜色的Alpha值
     //DstColor 因子为目标颜色值
     //DstAlpha 因子为目标颜色值的Alpha值
     //OneMinusSrcColor 因子为 1-源颜色值
     //OneMinusSrcAlpha 因子为 1-源颜色值Alpha分量
     //OneMinusDstColor 因子为 1-目标颜色值
     //OneMinusDstAlpha 因子为 1-目标颜色值Alpha分量
     

//混合操作命令
     //Add    混合后 源颜色 + 目标颜色
     //Sub    混合后 源颜色 - 目标颜色
     //RevSub  混合后 目标颜色 - 源颜色
     //Min    RGBA分量 在源颜色值与目标颜色值中取最小值 (会忽略混合因子)
     //Max    RGBA分量 在源颜色值与目标颜色值中取最大值 (会忽略混合因子)

//每个Pass定义了一个完成的渲染流程 SubShader中的Pass 会按顺序全部执行
     Pass
     {
       Name "TemplatePass" //定义Pass名称 可以使用UsePass 直接使用其他UnityShader中的Pass
       UsePass "ShaderTemplate/TemplatePass" //使用其他UnityShader中的Pass

Tags{"LightMode" = "ForwordBase"}
       //Pass中的Tags 选项如下
       //LightMode 选项列表
       //ForwardBase  前向渲染 该Pass会计算环境光,平行光,逐顶点/SH光源 和 LightMaps
       //Always    不管使用哪种渲染路径,该Pass总是会被渲染,但不计算任何光照
       //ForwardAdd  前向渲染 该Pass会计算额外的逐像素光照,每个Pass对应一个光源
       //Deferred   用于延迟渲染 该Pass会渲染G缓冲
       //ShadowCaster 把物体的深度信息渲染到阴影映射纹理Shadowmap 或 一张深度纹理中
       //PrepassBase  遗留的延迟渲染 该Pass会渲染法线和高光反射的指数部分
       //PrepassFinal 遗留的延迟渲染 该Pass通过合并纹理,光照和自发光来渲染得到最后的颜色
       

       //RequireOptions 用于指定当满足某些条件时才渲染该Pass 目前只支持 SoftVegetation

CGPROGRAM // Cg/HLSL 代码段
       \#pragma vertex vert //编译指令指明顶点着色器代码
       \#pragma fragment frag //指明片元着色器代码
       
       \#include "UnityCG.cginc" //引入unity 内置文件

//Shader中使用属性 我们需要在CG代码中定义一个与属性名称和类型都匹配的变量
       sampler2D _MainTex;
       float4 _MainTex_ST;
       fixed4 _Color;
       half _Range;
       float _Float;
       int _Int;
       float4 _Vector;
       samplerCube _Cube;
       sampler3D _3D;

//浮点类型总结
### 如何在Unity中创建或使用Mod #### 创建文件夹结构 为了更好地管理项目中的资源,在开始开发之前,建议先创建必要的文件夹来存储Mod相关内容。例如,“构建/购买”和“CAS”的文件夹可以帮助分类不同类型的资产[^1]。 #### 添加Mod到游戏中 当需要在游戏中启用Mod时,可以通过特定路径加载这些Mod。如果已经在`Mods`目录下创建了一个名为`Mods教程`的子文件夹,并放入了一些示例Mod(如“Simkea Pack”和“Harrie's Plants”),那么启动游戏前应确认这些Mod已被正确配置并可用[^2]。 #### 调整Mod加载顺序 有时多个Mod可能会影响彼此的表现效果,比如一个改变整个Skyrim纹理风格而另一个仅修改雪地外观的情况下,确保后者被优先应用是非常重要的。这样可以防止全局性的更改覆盖掉局部细节调整[^4]。 #### 利用现有工具和技术支持 对于希望尝试制作自己首个基于Unity引擎的第一人称射击类游戏(FPS)的新手来说,可以从官方提供的FPS Microgame入手学习基本操作流程以及如何定制化个人作品[^3]。此过程中不仅能够掌握基础框架搭建方法还能了解到更多高级功能实现技巧。 #### 处理图形渲染参数设置 深入探讨一下关于Unity内部处理光照计算的部分内容:当我们涉及到每帧绘制所需的数据缓冲区(`UnityPerDraw`)时会发现其中有几个关键变量需要按照固定顺序声明以便于后续逻辑运算顺利执行。具体而言就是紧跟在`unity_WorldTransformParams`之后定义了两个四维向量型别的成员——分别是用于记录光源数量信息(y分量表示总数)`unity_LightData` 和作为索引数组存在长度为二 的 `unity_LightIndices`, 它们共同决定了每个物体最多能支持八个关联灯光源对象[^5]. ```csharp // Example C# code snippet demonstrating how these variables might look within shader program. struct UnityPerDraw { float4 unity_WorldTransformParams; float4 unity_LightData; // Number of lights stored in y-component float4 unity_LightIndices[2]; // Array holding indices for up to 8 lights per object }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值