URP shader 学习笔记
自学shader中,shader的api不好找啊。自己整理整理 万一以后有用呢~(未完待续)
目录
- 写在前面
- ShaderGraph节点库
- 小技巧
- 小技巧001
- Shader结构
- Properties中的写法
- 2D贴图
- Rect贴图
- Cube贴图 (天空盒)
- 颜色
- 浮点数
- 滑动条
- 四元数 Vector
- Tag中的写法
- RenderPipeline 渲染管道
- SubShader中Tag
- Queue (渲染顺序)
- RenderType (渲染类型)
- DisableBatching (是否禁用Batch(打包、合并))
- ForceNoShadowCasting (是否强制不投射阴影)
- IgnoreProjector 无视投影器
- CanUseSpriteAtlas 可使用精灵集
- PreviewType 材质的预览形式
- Pass中Tag
- LightMode (光照模式)
- PassFlags
- RequireOptions
- SubShader相关
- SubShader
- 多pass模式
- include 引入包
- Cull (表面剔除)
- HLSLPROGRAM->ENDHLSL
- #pragma
- 顶点/片元着色器函数
- shader中的坐标转换函数
- 内置的变换矩阵
- 变换矩阵封装好的方法
- 顶点变化
- 方向变化
- 法线变化
- shader中的语义
- 应用阶段传递模型数据给顶点着色器时常用语义
- 顶点着色器传递给片元着色器时常用语义
- 片元着色器输出时常用语义
- 资料
- 参考书籍
写在前面
这篇文章是我自己在网上找的其他人的文章,总结归纳了一下。我也是刚开始学写shader,可能会有地方写的不对,如果看到我文章的大佬知道那里出错,麻烦指出,我一定虚心改正。该文章仅供参考!仅供参考!仅供参考!。
ShaderGraph节点库
当有不知道怎么调用api的时候参考ShaderGraph的节点库中的代码解释,秒懂。。
shaderGraph节点库
小技巧
小技巧001
先用ShaderGraph连连线,实现的差不多之后,再用代码翻译过来,会学的比较快诶!就跟抄答案一样。
Shader结构
Shader "文件路径/文件名"
{//属性面板Properties{//包含在Inspector中可配置的各种属性//贴图_Texture2D("Texture2D", 2D) = "white" {}//颜色_Color("Color", Color) = (1,1,1,1)}//子着色器SubShader{//标签 设置当前子着色器的基本属性 例如渲染管线、渲染顺序、渲染模式等Tags{"RenderPipeline"="UniversalRenderPipeline" }//一个Pass就是渲染一次模型Pass{//URP代码片段 从 HLSLPROGRAM开始到ENDHLSL结束HLSLPROGRAM//顶点着色器#pragma vertex vert//片元着色器#pragma fragment frag//需要引入的文件#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"//模型数据struct Attributes{float4 posOS : POSITION;float2 uv : TEXCOORD0;};//struct Varyings{float2 uv : TEXCOORD0;float4 posHCS : SV_POSITION;};//采样TEXTURE2D(_Texture2D);SAMPLER(sampler_Texture2D);//C-BufferCBUFFER_START(UnityPerMaterial)float4 _Texture2D_ST;half4 _Color;CBUFFER_END//顶点着色器Varyings vert(Attributes IN){Varyings OUT;OUT.posHCS = TransformObjectToHClip(IN.posOS.xyz);OUT.uv = TRANSFORM_TEX(IN.uv, _Texture2D);return OUT;}//片元着色器half4 frag(Varyings IN) : SV_Target{return SAMPLE_TEXTURE2D(_Texture2D, sampler_Texture2D, IN.uv) * _Color;}//结束代码片段ENDHLSL}}
}
Properties中的写法
变量名(“inspector中显示的名称”,类型) = 默认值
_Texture2D("Texture2D", 2D) = "white" {}
2D贴图
_Texture2D("Texture2D", 2D) = "white" {}
贴图之类的需要在默认值后面加个{}
Rect贴图
_Rect("Rect Tex",Rect) = "white" {}
Cube贴图 (天空盒)
_Cube("Cube Tex",Cube) = "" {}
颜色
_Color("Color", Color) = (1,1,1,1)
浮点数
_Float("Float",float) = 0
滑动条
_Range("Range",Range(0,1)) = 0.5
四元数 Vector
_Vector("Vector",Vector)=(0,0,0,0)
Tag中的写法
RenderPipeline 渲染管道
使用URP渲染
"RenderPipeline"="UniversalRenderPipeline"
需要搭配下列代码一起使用,include后面会详解 这里给个示例
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
除设置渲染管线外
tag包括两部分,一部分是SubShader中,一部分在Pass中。
这部分是腾讯学堂找到的,原文直通车:https://gameinstitute.qq.com/community/detail/121997
SubShader中Tag
Queue (渲染顺序)
参数 | 默认值 |
---|---|
Background | 1000 |
Geometry | 2000(不写的话默认是这个) |
AlphaTest | 2450 |
Transparent | 3000 |
Overlay | 4000 |
Tags{"Queue"="Geometry"
}
RenderType (渲染类型)
参数 | 默认值 |
---|---|
Opaque:不透明(法线、自发光、反射、地形Shader) | |
Transparent | 半透明(透明、粒子、字体、地形添加通道Shader) |
TransparentCutout | 遮罩透明(透明裁切、双通道植物Shader) |
Background | 天空盒Shader |
Overlay | GUI纹理、光晕、闪光Shader |
TreeOpaque | 地形引擎——树皮 |
TreeTransparentCutout | 地形引擎——树叶 |
TreeBillboard | 地形引擎——公告牌(始终面向摄像机)式树木 |
Grass | 地形引擎——草 |
GrassBillboard | 地形引擎——公告牌(始终面向摄像机)式草 |
Tags{"RenderType"="Opaque"
}
DisableBatching (是否禁用Batch(打包、合并))
参数 | 默认值 |
---|---|
True | 禁用 |
False | 不禁用(默认) |
LODFading | 当LOD fade开启的时候禁用,一般用在树木上面 |
Tags{"DisableBatching" = "True"
}
ForceNoShadowCasting (是否强制不投射阴影)
当这个值为True的时候,使用这个Shader的对象便不会投射阴影。
一般用于透明对象,或者不想继承其他shader阴影的时候。
参数 | 默认值 |
---|---|
True | 禁用 |
False | 不禁用(默认) |
Tags{"ForceNoShadowCasting" = "False"
}
IgnoreProjector 无视投影器
当这个值为True的时候,对象便不受投射器影响。
一般用于半透明对象,因为让投射器影响它们不是什么好事情。
CanUseSpriteAtlas 可使用精灵集
当这个值为False的时候,不能使用精灵集。
PreviewType 材质的预览形式
默认显示为球体,可以使用Plane(2D平面)或Skybox(天空盒)
Pass中Tag
(还没用过,先记下吧)
LightMode (光照模式)
有位大佬解释的挺详细的,直通车https://blog.csdn.net/qq_39574690/article/details/105743236
参数 | 默认值 |
---|---|
Always | 总是渲染,不使用光照 |
ForwardBase | 用于前向渲染,使用环境光、主平行光、顶点/SH(球谐函数)光照以及光照贴图 |
ForwardAdd | 用于前向渲染,额外使用每像素光,每个光照一个通道 |
Deferred | 用于延迟着色,渲染G-Buffer |
ShadowCaster | 渲染对象的深度到阴影贴图或者深度纹理 |
PrepassBase | 用于(旧版)延迟光照,渲染法线和高光指数 |
PrepassFinal | 用于(旧版)延迟光照,合并贴图、光照和自发光来渲染最终色彩 |
Vertex | 当对象不受光照贴图影响的时候,用来渲染(旧版)顶点发光。使用所有的顶点光照 |
VertexLMRGBM | 当对象接受光照贴图影响的时候,用来渲染(旧版)顶点发光。适用于使用RGBM编码光照贴图的平台(PC&主机) |
VertexLM | 当对象接受光照贴图影响的时候,用来渲染(旧版)顶点发光。适用于使用double-LDR编码光照贴图的平台(移动平台) |
Tags{"LightMode"="Always"
}
PassFlags
标志渲染管线如何传递数据给通道
OnlyDirectional:只有主平行光、环境光和光照探测器的数据会传递给通道
仅用于LightMode为ForwardBase
RequireOptions
标志通道至于在某些外部条件满足时才会被渲染
SoftVegetation:当Quality Setting中的Soft Vegetation选项被开启时,才会渲染通道
SubShader相关
SubShader
每个shader文件中至少有一个SubShader,它标记了针对某种显卡的渲染方式,当一个shader文件被使用的时候,显卡会找到改文件中的所有SubShader块,如果所有的SubShader都不能执行,则会使用Fallback 标记的shader。
每个SubShader中至少有一个Pass块
结构如下
Shader "ShaderName"{SubShader{//针对显卡APass{//xxx}}SubShader{//针对显卡BPass{//xxx}}SubShader{//针对显卡CPass{//xxx}}Fallback "Lit"
}
多pass模式
给Pass设置不同的LightMode可实现多Pass,URP最多是3个Pass。
原理还没看,想研究的话自行百度。
下面是简单示例。应该能看懂
SubShader
{Tags{"RenderPipeline"="UniversalRenderPipeline"}//OutLine 描边PassPass{Tags{"LightMode" = "SRPDefaultUnlit"}}Pass{Tags{"LightMode" = "UniversalForward"}}Pass{Tags{"LightMode" = "LightweightForward"}}
}
include 引入包
类型 | 包名 |
---|---|
Core | Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl |
Light | Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl |
Shadow | Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl |
其他有用的:
包名 |
---|
Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlsl |
Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderVariablesFunctions.hlsl |
Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl |
Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl |
Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl |
Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl |
Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareOpaqueTextue.hlsl |
Pass
{#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
}
摘抄自https://www.cnblogs.com/kexiaohao/p/16638070.html
Cull (表面剔除)
Cull Off 不剔除
Cull Back(默认)剔除背面(内表面)
Cull Front 剔除正面(外表面)
Pass
{Cull Off
}
HLSLPROGRAM->ENDHLSL
应该是标记代码块,告诉引擎是用什么写的代码
Pass
{HLSLPROGRAMENDHLSL
}
#pragma
告诉Unity哪个函数包含了顶点着色器的代码,哪个函数包含片元着色器的代码。
#pragma vertex name
Pass
{HLSLPROGRAM#pragma vertex vert#pragma fragment fragENDHLSL
}
顶点/片元着色器函数
shader中的坐标转换函数
内置的变换矩阵
参数名 | 对应的方法名 | 解释 |
---|---|---|
UNITY_MATRIX_MVP | 当前的模型x观察x投影矩阵,用于将顶点/方向矢量从模型空间变换到裁剪空间 | |
UNITY_MATRIX_MV | 当前的模型x观察矩阵,用于将顶点/方向矢量从模型空间变换到观察空间 | |
UNITY_MATRIX_V | GetWorldToViewMatrix() | 当前的观察矩阵,用于将顶点/方向矢量从世界空间变换到观察空间 |
UNITY_MATRIX_P | GetViewToHClipMatrix() | 当前的投影矩阵,用于将顶点/方向矩阵从观察空间变换到裁剪空间 |
UNITY_MATRIX_VP | GetWorldToHClipMatrix() | 当前的观察x投影矩阵,用于将顶点/方向矢量从世界空间变换到裁剪空间 |
UNITY_MATRIX_T_MV | UNITY_MATRIX_MV的转置矩阵 | |
UNITY_MATRIX_IT_MV | UNITY_MATRIX_MV的逆转置矩阵,用于将法线从模型空间变换到观察空间,也可用于得到UNITY_MATRIX_MV的逆矩阵 | |
_Object2World/UNITY_MATRIX_M | GetObjectToWorldMatrix() | 当前的模型矩阵,用于将顶点/方向矢量从模型空间变换到世界空间 |
_World2Object | GetWorldToObjectMatrix() | _Object2World的逆矩阵,用于将顶点/方向矢量从世界空间变换到模型空间) |
摘抄自Unity Shader入门精要(冯乐乐 著)
变换矩阵封装好的方法
顶点变化
函数名 | 解释 |
---|---|
float3 TransformObjectToWorld(float3 positionWS) | 模型空间->世界空间 |
float3 TransformWorldToObject(float3 positionOS) | 世界空间->模型空间 |
float3 TransformWorldToView(float3 positionWS) | 世界空间->观察空间 |
float4 TransformObjectToHClip(float3 positionOS) | 模型空间->世界空间->裁剪空间(将位置从对象空间转换为同质空间)效果与上面MVP相同,但比MVP更高效 |
float4 TransformWorldToHClip(float3 positionWS) | 世界空间->裁剪空间(将位置从世界空间转换为同质空间) |
float4 TransformWViewToHClip(float3 positionVS) | 观察空间->裁剪空间(将位置从视图空间转换为同质空间) |
方向变化
函数名 | 解释 |
---|---|
float3 TransformObjectToWorldDir(float3 dirOS, bool doNormalize = true) | 模型空间->世界空间 |
float3 TransformWorldToObjectDir(float3 dirWS, bool doNormalize = true) | 世界空间->模型空间 |
real3 TransformWorldToViewDir(real3 dirWS, bool doNormalize = false) | 世界空间->观察空间 |
real3 TransformWorldToHClipDir(real3 directionWS, bool doNormalize = false) | 模型空间->世界空间->裁剪空间 |
法线变化
函数名 | 解释 |
---|---|
float3 TransformObjectToWorldNormal(float3 normalOS, bool doNormalize = true) | 模型空间->世界空间 |
float3 TransformWorldToObjectNormal(float3 normalWS, bool doNormalize = true) | 世界空间->模型空间 |
shader中的语义
语义是赋给Shader输入和输出的字符串,这个字符串表达了这个参数的含义。
这些语义可以上shader知道从哪里读数据,并把这个数据输出到哪里。
常用的语义
应用阶段传递模型数据给顶点着色器时常用语义
语义 | 解释 |
---|---|
POSITION | 模型空间的顶点位置 float4 |
NORMAL | 顶点法线 float3 |
TANGENT | 顶点切线 float4 |
TEXCOORD0 | 顶点纹理坐标 float2/float4 |
COLOR | 顶点颜色 float4 |
顶点着色器传递给片元着色器时常用语义
语义 | 解释 |
---|---|
SV_POSITION | 裁剪空间中的顶点坐标 |
COLOR0 | 输出顶点颜色 |
TEXCOORD0 | 顶点纹理坐标 |
片元着色器输出时常用语义
语义 | 解释 |
---|---|
SV_Target | 输出值会存储到渲染目标(render target)中 |
资料
内置管线Shader升级到URP详细手册
shaderGraph节点库
参考书籍
Unity Shader入门精要 (冯乐乐 著)
URP shader 学习笔记相关推荐
- Unity Shader 学习笔记(3)URP渲染管线带阴影PBR-Shader模板(ASE优化版本)
此 Shader 已经不是最新版本,最新版本见本专栏的第四篇文章: Unity Shader 学习笔记(4) 材质面板截图: 功能实现(URP渲染管线下): PBR材质.投射和接收阴影. 代码展示: ...
- Unity Shader 学习笔记(33) 全局光照(GI)、反射探针、线性空间和伽马空间、高动态范围(HDR)
Unity Shader 学习笔记(33) 全局光照(GI).反射探针.线性空间和伽马空间.高动态范围(HDR) 参考书籍:<Unity Shader 入门精要> [<Real-Ti ...
- Unity Shader 学习笔记(27)渲染轮廓线(描边)方法、卡通风格渲染、素描风格渲染
Unity Shader 学习笔记(27)渲染轮廓线(描边)方法.卡通风格渲染.素描风格渲染 参考书籍:<Unity Shader 入门精要> 渲染轮廓线(描边) 五种方法: 基于观察角度 ...
- Shader学习笔记(三)学习Shader所需的数学基础
感受高数 一.笛卡尔坐标系 1.二维笛卡尔坐标系 2.三维笛卡尔坐标系 二.点和矢量 1.矢量和标量的乘法/除法 2.矢量的加法和减法 3.矢量的模 4.单位矢量 5.矢量的点积 6.矢量的叉积(cr ...
- 【Unity】Unity Shader学习笔记(二)渲染管线
文章目录 渲染管线(Randering Pipeline) 渲染流程 可编程渲染管线 应用阶段 把数据加载到显存中 设置渲染状态 调用DrawCall 几何阶段.光栅化阶段 渲染管线(Randerin ...
- Unity Shader 学习笔记(4)URP渲染管线带阴影PBR-Shader模板 -- 新增可自定义阴影颜色
材质面板截图 功能实现(URP渲染管线下): 1.进一步优化Shader结构和算法: 2.包含PBR材质: 3.投射和接收阴影,并升级支持自定义阴影颜色: 4.支持点光源照射(但不支持点光源阴影). ...
- Unity Shader学习笔记/Urp/水墨风效果
实现简易的水墨风效果大致分为三部分: 1.将原始的rgb贴图转化为灰度图 float4 baseMap = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN ...
- Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板
写在之前 Shader变体.Shader属性定义技巧.自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用 ...
- 通用渲染管线(URP)_学习笔记
通用渲染管道概述 通用渲染管线 (Universal Render Pipeline, URP) 是由Unity制作的预构建可编程渲染管线 (Scriptable Render Pipeline).U ...
最新文章
- 分销与供应链海外采购电子元器件,你需要了解哪些报关知识?
- bs模型Nd怎么用计算机算,BS模式的下试卷自动生成系统的设计与实现
- [转]Windows 7 产品密钥是否安全
- 【蓝桥杯官网训练 - 历届试题】对局匹配(dp,思维,取模)
- python-解码 decode 报错的问题
- Spark之性能优化(重点:并行流数据接收)
- 为监控主机添加SNMPv3模板
- 下载文件变成php文档,关于文件下载后变成PHP格式的解决办法
- java段注释_Java的注释
- 手把手学习Vue3.0:开发工具WebStorm和Vue模板文件介绍
- 2019安徽省程序设计竞赛 D自驾游 题解
- 【\u20a 错误解决】
- Android中JNI开发之常见错误
- 超简单的_ps抠图_在线抠图工具_智能抠图_速抠图
- NL2SQL概述:一文了解NL2SQL
- url短网址 java_url.cn短网址生成api接口(腾讯短链接url生成)
- springboot 转换为金额大写工具类
- form表单美化插件之jqTransform
- “高墙”内的信息安全(转)
- 客户订购登记管理系统(数据库)