【Unity Shader入门精要 第5章】开始 Unity Shader 学习之旅

1. shaderLab语义

在之前的代码中,经常会看到类似POSITION 、SV_POSITION之类的东西,这些都属于shaderLab的语义。简单来讲,这类语义的作用就是用来通知Unity某个变量(或参数、输出)是干什么用的,可以以此为依据确定数据的来源和去处,这样引擎就知道需要用什么数据对相应的变量进行填充或将相应的数据填充到哪里。

如果按照固定程度来理解,大概可以分成以下三类:

  • 以SV_开头的语义,表示在渲染流水线中有特定的含义,一般用于将输出数据填充到固定的位置,如SV_Target语义表示输出填充到当前渲染的目标缓冲区(颜色缓冲区或Render Texture),且在渲染流水线的对应阶段要求必须包含相应的SV语义
  • 用于接收特定输入的语义,这类语义一般用于在渲染流水线的特定阶段接收特定数据,Unity可以根据这类语义从对应的组件(或位置)取出数据填充到相应的变量中,如在顶点着色器中用POSITION语义接收模型空间下的顶点位置
  • 除了接收特定输入外,还可以用来向后续渲染流程传递自定义数据的语义。由于我们可能用这些变量进行传值,所以这类语义在流水线的不同阶段内可能存储的值的意义不同。如COLOR0 、TEXCOORDn等

顶点着色器输入常用语义

语义说明
POSITION模型空间中的顶点坐标
NORMAL模型空间中当前顶点的法向量
TANGENT模型空间中当前顶点的切向量
TEXCOORDn当前顶点对应第n张纹理的纹理坐标
COLOR当前顶点颜色

顶点着色器输出常用语义

语义说明
SV_POSITION顶点在齐次裁剪空间中的坐标,顶点着色器的输出中必须要包含一个该语义的数据
COLOR0一般用于向后续阶段传递自定义数据
COLOR1一般用于向后续阶段传递自定义数据
TEXCOORDn纹理坐标,也可用于向后续阶段传递自定义数据

片元着色器输出常用语义

语义说明
SV_Taget输出颜色填充到当前目标颜色缓冲区,片元着色器输出必须包含一个该语义的数据

2. 定义结构

在Unity Shader中可以使用自定义的数据结构
定义和使用都在CG代码段中

定义方式:

struct 结构名
{类型 变量名 :语义;...
}

struct v2f
{float4 color :COLOR0;
}

使用方式:

结构名 变量名;

如:

v2f o;
o.color = (1,1,1,1);

2. 使用顶点着色器

顶点着色器的定义位置在CG代码段中

定义方式为:

#pragma vertex 顶点着色器方法名

如:

#pragma vertex vert

顶点着色器方法结构为;

返回类型 方法名(输入类型 输入参数 : 输入语义) : 输出语义

如:

float4 vert(float4 position :POSITION) : SV_POSITION

如果返回类型为自定义结构,则不需要再在方法后面加输出语义(因为输出自定义结构中的字段已经加了语义),同理,如果输入类型为自定义结构,则输入参数也不需要指定输入语义。

如:

v2f vert(a2v input)

注意,顶点着色器的输出必须包含一个SV_POSITION语义的数据,如果输出为自定义结构,则该结构内必须包含一个SV_POSITION语义的变量

3. 使用片元着色器

与顶点着色器大体相同,区别在于:

  • 定义片元着色器方法时用fragment,如:#pragma fragment frag
  • 片元着色器的输出必须包含SV_Target语义的数据

5. 使用变量

在Unity Shader中也可以使用自定义的变量,在使用前需要先对变量进行声明
声明变量的位置在CG代码段中
声明变量的方式为;

变量类型 变量名;

如:

float fixValue;

如果需要使用在Properties中定义的属性,则需要声明与该属性同名的变量,如:

Properties{_texValue("TexValue", 2D) = "White"{}}...CGPROGRAM
...
sampler2D _texValue;
...
ENDCG

另外我们看到,在Properties中,定义的属性类型为2D,但在声明变量的时候,声明的变量类型为sampler2D。这是因为ShaderLab中对于属性类型的划分和CG代码中对于变量类型的划分并不是一致的,一个类型的属性在CG代码中可能对应多个变量类型,但在声明变量的时候,必须要使用可以被映射到类型

映射关系:

属性类型变量类型
Color Vectorfloat4 half4 fixed4
Range Floatfloat half fixed
2Dsampler2D
3Dsampler3D
CubesamplerCube

6. 包含文件

Unity提供一些后缀名为“.cginc”的include文件
类似于头文件,通过引用这些include文件,可以使用其中提供的变量或方法
引用位置在CG代码段中

引用方式:

#include "文件名.cginc"

如:

#include "UnityCG.cginc"

UnityCG.cginc是最常用的include文件,其中包含了前文提到的UNITY_MATRIX_MVP等常用变量,同时也提供了许多常用的变换方法

方法返回类型方法说明
WorldSpaceLightDir(float4 v)float3输入一个模型空间下的坐标,返回世界空间下该位置的光源方向
ObjSpaceLightDir(float4 v)float3输入一个模型空间下的坐标,返回模型空间下该位置的光源方向
WorldSpaceViewDir(float4 v)float3输入一个模型空间下的坐标,返回世界空间下该位置的视线方向
ObjSpaceViewDir(float4 v)float3输入一个模型空间下的坐标,返回模型空间下该位置的视线方向
方法返回类型方法说明
UnityObjectToWorldNormal(float3 normal)float3将法线从模型空间转换到世界空间
UnityObjectToWorldDir(float3 dir)float3将普通向量从模型空间转换到世界空间
UnityWorldToObjectDir(float3 dir)float3将普通向量从世界空间转换到模型空间
方法返回类型方法说明
UnityWorldSpaceLightDir(float4 v)float3输入一个世界空间下的位置,返回世界空间下该位置的光源方向
UnityWorldSpaceViewDir(float4 v)float3输入一个世界空间下的位置,返回世界空间下该位置的视线方向

注意:以上返回都是未经过归一化的,需要在使用时根据实际情况自己手动进行归一化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/7473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker 的网络实现

简介 标准的 Docker 支持以下 4 类网络模式: 1)host 模式:使用 --nethost 指定 2)container 模式:使用–netcontainer:NAME_or_ID 指定 3)none模式:使用 --netnone 指定 4)bridge 模…

C语言 循环语句 (3) for 循环语句

接下来 我们来看第三个 for语句 基本语句是 for关键字 然后小括号 括号中三个表达式 然后它对表达式2进行判断 如果表达式2条件成立 则走进循环体 执行完循环体 会回来执行表达式3 然后再返回来 继续对表达式2进行判断 如果表达式2 还是成立 这继续循环往复 直到表达式2的条件…

2024年巴黎奥运会网络安全风险评估

研究显示,2024年巴黎奥运会组委会网站的总体网络安全态势基本安全,但也凸显了一些风险,包括开放端口、SSL错误配置、cookie同意违规和域名抢注。 2024年巴黎奥运会备受全球关注,预计将有超过10亿人观看2024年巴黎奥运会&#xff…

公司后缀缩写

Co. Co. 是 company 的缩写,company 本身就是公司(统称)的意思,包括了各种类型公司。 单独使用 Co. 看不出公司具体的类型,经常会跟另一后缀一起使用 Co.,Ltd (意思看后面)。 Ltd. Ltd. 是 L…

uniapp离线在Xcode上打包后提交审核时提示NSUserTrackingUsageDescription的解决方法

uniapp离线在Xcode上打包后提交审核时提示NSUserTrackingUsageDescription的解决方法 问题截图: 亲测有效的方法 方法一: 选择通过uniapp的开发工具Hbuilder来进行在线打包,取消默认勾选的以下选项。 然后进行在线打包就不会存在提交审…

MySQL:多表查询练习

#1.出版社信息 与 图书信息 交叉连接 select * from 出版社信息 cross join 图书信息; #2.从“客户信息”和“订单信息”两张数据表中查询购买了商品的客户信息,要求查询结果显示客户姓名、订单编号、订单状态。 select 客户信息.客户姓名,订单信息.订单编号,订单…

PS路径文字怎么变换的?

如果网友们没有用过钢笔工具,画好后的样子是什么,建议你看看这个方法! 建立的路径之后,在编辑菜单栏里单击。 选择变换路径,可以改变路径文字的方向,点击垂直翻转即可完成方向的改变!

linux进阶篇:Nginx反向代理原理与案例详解

Linux服务搭建篇:Nginx反向代理原理与案例详解 一、什么是正向代理 举个栗子: 我们在校外、公司外,是访问不到学校、公司的内网的,但是我们想要访问内网资源时,会用到VPN。而一般内网会存在一个VPN服务器&#xff0c…

imx6ull开发板设置SD卡启动,SD卡中烧写uboot,kernel,设备树,根文件系统fs

IMX6ULL ARM Linux开发板SD卡启动,SD卡的分区与分区格式化创建_sd制作分区-CSDN博客

n皇后问题

843. n-皇后问题 - AcWing题库 n皇后这道题目, 历来被作为理解深搜\回溯法的样板题, 首先我们可以用中规中矩的深搜来解决这道题: #include<iostream> using namespace std; const int N10; int n; char g[N][N];bool col[N],dg[N],udg[N];bool legal(int u,int i) {ret…

vulhub之jboss(CVE-2017-7504)

JBoss AS 4.x 及之前版本中&#xff0c; JbossMQ 实现过程的 JMS over HTTP Invocation Layer 的 HTTPServerILServlet.java 文件存在反序列化漏洞&#xff0c;远程攻击者可借助特制的序列化数据利用该漏洞执行任意代码。 CVE-2017-7504 漏洞与 CVE-2015-7501 的漏洞原理相似&a…

「51媒体」企业单位新闻稿件考核,怎么发布

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 电力税务企事业单位部门等单位提供了新闻稿件&#xff0c;如何在一些重点媒体进行宣发呢&#xff1a; 精准锁定发布媒体 了解考核要求&#xff1a;仔细阅读宣传任务名单&#xff0c;了解…

C++初阶之list的使用和模拟以及反向迭代器的模拟实现

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 一.list简介 list是一个带头双向链表&#xff0c;在数据结构的时候…

生成ssh来连接git

生成SSH密钥&#xff1a; 打开你的命令行终端&#xff08;如Windows的CMD、PowerShell&#xff0c;或者Linux/Mac的Terminal&#xff09;。 运行以下命令来生成SSH密钥对&#xff08;私钥和公钥&#xff09;&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexampl…

c++ 的线程是个对象吗

在C中&#xff0c;线程通常不是直接通过对象来表示的&#xff0c;但C11及以后的标准引入了对线程的高级抽象&#xff0c;主要是通过<thread>库中的std::thread类来实现的。因此&#xff0c;可以说std::thread是一个类&#xff0c;其实例&#xff08;对象&#xff09;表示…

10个SpringMVC的核心组件详解

Spring MVC 的核心组件是构成整个框架的基础&#xff0c;它们协同工作以支持基于 MVC 架构的 Web 应用程序开发。以下是V哥工作中整理的每个组件的详细介绍&#xff0c;包括示例代码和解释&#xff1a; 1. DispatcherServlet&#xff1a; 作用&#xff1a;作为前端控制器&…

不必追求深度,浅尝辄止为宜

近日笔者撰文称&#xff0c;有幸应《百度-百家号》相邀&#xff0c;在其发起的《征文任务》栏目中写作深度文章&#xff0c;便试着开头写了一篇《万科有“活下去”的可能性吗&#xff1f;》的时评文章&#xff0c;于5月3日发表&#xff0c;舆情反映不错&#xff0c;不到三天时间…

python菜鸟级安装手册

python安装教程 电脑-右键-属性&#xff0c;确认系统类型和版本号&#xff0c;比如本案例系统是64位 win10 点击python官网&#xff0c;进行下载 适用于 Windows 的 Python 版本 |Python.org 选择第一个安装程序64位即可满足需要&#xff0c; 嵌入式程序包是压缩包版本&…

JavaScript中的RegExp和Cookie

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 &#x1f506;RegExp &#x1f3b2; 1 什么是正则表达式 &#x1f3b2;2 创建…

山东省文史书画研究会成立20周年系列活动徽标征集胜选名单公布

2024年5月1日&#xff0c;山东省文史书画研究会成立20周年系列活动徽标征集落下帷幕。征稿启事下发后&#xff0c;得到社会各界人士的广泛关注与参与&#xff0c;共收到设计方案608件。经过初评&#xff0c;选出5幅作品进入复评&#xff0c;并经过网络投票和专家投票相结合的方…