【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.mfbz.cn/a/597055.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BEV下统一的多传感器融合框架 - FUTR3D

BEV下统一的多传感器融合框架 - FUTR3D 引言 在自动驾驶汽车或者移动机器人上,通常会配备许多种传感器,比如:光学相机、激光雷达、毫米波雷达等。由于不同传感器的数据形式不同,如RGB图像,点云等,不同模态…

JavaScript注释规范

你好,我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃 ,大专生,一枚程序媛,感谢关注。回复 “前端基础题”,可免费获得前端基础 100 题汇总,回复 “前端基础路线”,可获…

基于C++基础知识的循环语句

一、while循环 while循环语句形式如下: while(表达式){语句 } 循环每次都是执行完语句后回到表达式处重新开始判断,重新计算表达式的值,一旦表达式的值为假就退出循环。用花括号括起来的多条简单语句,花括号及其包含的语句被称…

ContEA阅读笔记

Facing Changes: Continual Entity Alignment for Growing Knowledge Graphs 面对变化:不断增长的知识图谱的持续实体对齐 Abstract 实体对齐是知识图谱(KG)集成中一项基本且重要的技术。多年来,实体对齐的研究一直基于知识图谱是静态的假设&#xff…

Day 41 343.整数拆分 96.不同的二叉搜索树

整数拆分 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2输出: 1解释: 2 1 1, 1 1 1。 示例 2: 输入: 10输出: 36解释: 10 3 3 4, 3 3 4 36。说明: 你可以假设 …

Java基础教程 - 5 数组

更好的阅读体验:点这里 ( www.doubibiji.com ) 更好的阅读体验:点这里 ( www.doubibiji.com ) 更好的阅读体验:点这里 ( www.doubibiji.com ) 5 数组 前面我们保存数据…

前端基础学习html(1)

1.标题标签.h1,h2...h6 2.段落标签p 换行标签br 3.加粗strong(b) /倾斜em(i) /删除 del(s) /下划线ins(u) 4.盒子:div //一行一个 span//一行多个 5.img :src alt title width height border 图片src引用:相对路径 上级/同级/中级 绝对路径&#xff…

直播话术核心逻辑,学了轻松提高销量!沈阳直播运营培训

直播话术到底该怎么说? 产品话术说得好,直播间一次就能卖出去上万件产品;产品话术说不好,直播间半个月也卖不出去10件产品。 我们上次就有跟大家说过产品话术的具体流程,但发现还有更多朋友居然还是不能够很好地完成一…

2024/5/6 QTday1

自由发挥应用场景,实现登录界面。 要求:尽量每行代码都有注释。 #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//窗口相关设置this->resize(350,470);this->setFixedSize(350,470);//窗口标题this-&g…

一个简单的仓库出入库管理软件的流程是什么样的?有哪些功能?

身为仓库文员,我深知仓库管理对于公司运营的重要性。仓库是公司物资的中转站,其管理的好坏直接关系到公司的运营效率和成本控制。然而,传统的仓库管理方式往往存在着效率低下、易出错等问题,为了解决这些问题,我们需要…

uboot图形界面配置

文章目录 一、环境安装二、配置默认项2.图形界面 三、图形配置项的来源1.mainmenu主界面 一、环境安装 💦uboot 或 Linux 内核可以通过输入“make menuconfig”来打开图形化配置界面,menuconfig是一套图形化的配置工具,需要 ncurses 库支持。…

2024年电工杯数学建模竞赛A题B题思路代码分享

您的点赞收藏是我继续更新的最大动力! 欲获取更多电工杯学习资料,可点击如下卡片链接 点击链接加入群聊【2024电工杯】:http://qm.qq.com/cgi-bin/qm/qr?_wv1027&k_PrjarulWZU8JsAOA9gnj_oHKIjFe195&authKeySbv2XM853pynlnXiv6M58…

解决github的remote rejected|git存储库的推送保护

前言 git存储库的推送保护。当你试图推送代码到GitHub仓库时,由于存在与主分支(master)相关的仓库规则违规行为,推送会被拒绝了。这种保护机制帮助确保只有经过授权和符合规定的代码才能被合并到主分支,从而保护了主分…

网络聊天室:通过Servlet和JSP,结合session和application实现(文末附源码)

目录 一.成品效果 二.代码部分 chat.jsp ChatServlet 一.成品效果 在启动成功后,我们就可以在任意俩个浏览器页面中相互发消息,如图所示左边屏幕使用的是Edge浏览器,右图使用的是火狐浏览器。当然笔者这里只是简单实现最基本的一些功能&…

【LeetCode刷题记录】105. 从前序与中序遍历序列构造二叉树 106. 从中序与后序遍历序列构造二叉树

105 从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,1…

Linux--IIC驱动编程实验

对于 I2C 主机驱动,一旦编写完成就不需要再做修改,其他的 I2C 设备直接调用主机驱动提供的 API 函数完成读写操作即可。这个正好符合 Linux 的驱动分离与分层的思想,因此 Linux内核也将 I2C 驱动分为两部分: ①、 I2C 总…

盘一盘接口测试的那些痛点,你现在会解决了吗

前言 说到接口测试,想必大家一定不会陌生。接口测试就是测试系统组件间,接口对接是否顺畅的一种测试。包括测试数据能否交换、能否传递、能否正常控制管理过程,以及系统间的相互逻辑依赖关系,等等。 由于接口测试主要是检测系统…

5月3日江苏某厂冷却塔清洗工作汇报-智渍洁

5月3日 施工人员:张能超,张伟,刘平,曾巧 施工事项:空冷器脱脂 今日工作进度,清洗6台遇到的问题,就是那个喷雾器不经用,一会儿又坏了 重庆智渍洁环保科技有限公司专注于工业清洗&…

使用ThemeRoller快速实现前端页面风格美化

使用ThemeRoller快速实现前端页面风格美化 文章目录 使用ThemeRoller快速实现前端页面风格美化一、ThemeRoller二、使用方法1.基本操作面板介绍2.直接用现成的配色风格——Gallery画廊3.自定义风格——Roll Your Own4.下载风格包并应用到页面 一、ThemeRoller ThemeRoller是jQ…

欢乐钓鱼大师脚本,游戏托管一键操作!

欢迎来到《钓鱼大师乐趣无穷》!这里是一片充满了乐趣和挑战的钓鱼天地。不论你是刚刚入门的小白,还是已经成为老手的大神,本攻略将为你揭示如何在游戏中获得成功,并针对稀有鱼类的钓鱼技巧进行详细介绍。 一、初探钓鱼的乐趣 在《…
最新文章