Unity ShaderLab 坐标空间转换及方法
shader基础
shader空间坐标介绍
未完成的空间转换表
数据类型
名称 | shader中的变量名 | 数据类型 | 说明 |
---|---|---|---|
vertex | POSITION | float4 | 顶点在空间中的位置 |
normal | NORMAL | float4 | 垂直于顶点的直线 |
tengent | TANGENT | float4 | 与顶点的法线垂直 |
Direction | float3 | 顶点在空间中的朝向 | |
Destance | float3 | 两点之间的距离 | |
texcoord | TEXCOORD0 | float4 | 处理贴图的UV坐标 |
模型空间
输出空间 | 模型空间 | 世界空间 | 观察空间 | 裁剪空间 |
---|---|---|---|---|
坐标 | mul(unity_ObjectToWorld, v.vertex) = mul(UNITY_MATRIX_M, 方向或坐标) | float4 UnityObjectToViewPos(float4) = mul(UNITY_MATRIX_MV,顶点或方向) | mul(UNITY_MATRIX_MVP, 顶点或方向) | |
方向 | float3 UnityObjectToWorldDir(float3) :把方向矢量从模型空间变换到世界空间中 | |||
法线 | float3 UnityObjectToWorldNormal(float3) 把法线方向从模型空间转换到世界空间中 | mul(UNITY_MATRIX_IT_MV, 顶点或方向) | ||
灯光 | float3 ObjSpaceLightDir(float3)-float4 ObjectSpaceLightDir(float4):输入模型空间的顶点坐标,返回模型空间中从该点到光源的光照方向。需前向渲染中、且还没归一化 | |||
相机 | float3 ObjSpaceViewDir(float4 v) 输入一个模型空间中的顶点位置,返回模型空间中从该点到摄像机的观察方向。 | float3 WorldSpaceViewDir(float4 v) 输入一个模型空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向。 |
世界空间
输出空间 | 模型空间 | 世界空间 | 观察空间 | 裁剪空间 | 齐次空间 |
---|---|---|---|---|---|
坐标 | mul(unity_WorldToObject, 坐标或方向) =mul(UNITY_MATRIX_I_M, 坐标或方向) | mul(UNITY_MATRIX_V, 坐标或方向) | float4 UnityWorldToClipPos(float4) | ||
方向 | float3 Unity WorldToObjectDir(float3 dir)-float3 UnityWorldToObjectDir(float3)把方向矢量从世界空间变换到模型空间中 | ||||
法线 | |||||
灯光 | float3 UnityWorldSpaceLightDir(float4 v) -float3 WorldSpaceLightDir(float4 v) 仅可用于前向渲染中。输入一个世界空间中的顶点位置,返回世界空间中从该点到光源的光照方向。没有被归一化 | ||||
相机 | float3 UnityWorldSpaceViewDir(float4 v) 输入一个世界空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向 |
观察空间
输出空间 | 模型空间 | 世界空间 | 观察空间 | 裁剪空间 | 齐次空间 |
---|---|---|---|---|---|
坐标 | mul(UNITY_MATRIX_T_MV,顶点或方向) | mul(UNITY_MATRIX_I_V, 顶点或方向) | float4 UnityViewToClipPos(float4 ) = mul(UNITY_MATRIX_P, 顶点或方向) | ||
方向 | |||||
法线 | |||||
灯光 | |||||
相机 |
两种写法
unity5.6以下版本写法记作“old”:mul(v.vertex,UNITY_MATRIX_MVP)
unity5.6以上版本写法记作“new”:UnityObjectToClipPos(v.vertex)
//将顶点从模型空间转换为裁剪空间float3 vec;//模型空间转为裁剪空间vec = UnityObjectToClipPos(v.vertex);// vec = UnityObjectToClipPos(float4(v.vertex), 1.0));//模型空间转换为观察空间vec = UnityObjectToViewPos(v.vertex);// vec = mul(UNITY_MATRIX_MV, float4(v.vertex), 1.0)).xyz;//从世界空间转到观察空间vec = UnityWorldToViewPos(v.vertex);//模型空间转换到世界空间vec = UnityObjectToWorldDir(v.vertex);//观察空间转为裁剪空间vec = UnityViewToClipPos(v.vertex);//世界空间转到裁剪空间vec = UnityWorldToClipPos(v.vertex);//法线//法线从模型空间转换到世界空间vec = UnityObjectToWorldNormal(v.vertex);//世界空间转到模型空间vec = UnityWorldToObjectDir(v.vertex);//摄像机相关//输入一个object空间顶点位置,返回世界空间中从该点到摄像机的观察方向。vec = WorldSpaceViewDir(v.vertex); //输入一个object空间顶点位置,返回object空间中从该点到摄像机的观察方向。vec = ObjSpaceViewDir (v.vertex);//灯光//仅用于前向渲染,输入一个object空间顶点的位置,返回世界空间中从该点到光源的光照方向vec = WorldSpaceLightDir (v.vertex);//仅用于前向渲染,输入一个object空间顶点的位置,返回object空间中从该点到光源的光照方向vec = ObjSpaceLightDir (v.vertex);
自定义工具函数 随机函数
//获取随机噪点值,这里使用的因子是原x+时间长度
float noise = random(o.pos.x + _Time.y * 0.4);
//噪点/随机数发生器
float random (float n) {return frac(sin(dot(n, float2(12.9898,78.233)))*43758.5453123);
}
法线、切线、副切线\副法线
物体与摄像机的方向、距离
距离
// 将坐标转换到裁剪空间
float3 posView = mul(UNITY_MATRIX_MV,v.vertex).xyz;
// 物体与镜头距离
float distance = length(posView);
方向
//将顶点从模型空间转换到世界空间
float4 worldPos = mul(unity_ObjectToWorld, v.vertex);
//获取世界空间中,顶点到相机的方向
o.viewDir = normalize(UnityWorldSpaceViewDir(worldPos));
Unity ShaderLab 坐标空间转换及方法相关推荐
- Unity Shader入门精要第四章:学习Shader 所需的数学基础--坐标空间
Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.4.6.1 为什么要使用这么多不同的坐标空间 二.4.6.3 顶点的坐标空间变换过程 4.6.4 模型空间 4.6.6 观察空间 4 ...
- Unity Shader中内置的坐标空间与转换矩阵函数
模型空间(model space)也称为对象空间(object space)或局部空间(local space)是指以模型原点为原点的坐标系. 世界空间(world space)也称全局空间(glob ...
- Unity shader 入门之渲染管线三、空间转换
一个顶点是怎么显示在屏幕上的 开始 妞妞的鼻子是怎么绘制到屏幕上的? 一些重要的空间变换 渲染流水线中顶点的空间变换过程 模型空间 模型空间,有时也被称为对象空间(object space)或局部空间 ...
- Shader山下(十六)坐标空间与转换矩阵
模型空间(model space)也称为对象空间(object space)或局部空间(local space)是指以模型原点为原点的坐标系. 世界空间(world space)也称全局空间(glob ...
- Unity Shader学习三:坐标空间的变换
(注意,由于格式问题,文中如p-c.c-p.c.p这类的为矢量的下标,-1.T为矩阵的上标) 假设现在有一个父坐标空间以及一个子坐标空间,已知父级坐标空间中子级坐标空间的原点位置以及3个单位坐标轴,此 ...
- python获取中文字体点阵坐标_Python实现点阵字体读取与转换的方法
点阵字体是指根据文字的像素点来显示的字体,效果如下: 使用Python读取并显示的过程如下: 根据中文字符获取GB2312编码 通过GB2312编码计算该汉字在点阵字库中的区位和码位 通过区位和码位计 ...
- unity向服务器发送xml文件格式,Unity读取Excel文件转换XML格式文件的方法
Unity读取Excel文件转换XML格式文件的方法 发布时间:2020-06-23 09:34:33 来源:亿速云 阅读:107 作者:清晨 不懂Unity读取Excel文件转换XML格式文件的方法 ...
- oracle 表空间转换,Oracle表空间数据文件移动的方法
实现把用户表空间中的数据文件从某一个路径移动到另一个路径 一.针对可offline的非系统表空间 本例移动oracle的案例表空间(EXAMPLE表空间),将其从 D:\ORADATA\ORCL\ 移 ...
- Unity ShaderLab学习总结
http://www.jianshu.com/p/7b9498e58659 Unity ShaderLab学习总结 作者 DonaldW 关注 2014.07.20 17:17* 字数 4891 阅读 ...
最新文章
- 2018-3-25论文(Whale Optimizer Algorithm)+(Gery Wolf Optimizer)笔记二---Introduction 对比
- zabbix 监控端口,其他端口和此端口类似
- 个人作业——软件产品分析
- python爬b站评论_Python爬虫入门教程 32-100 B站博人传评论数据抓取 scrapy
- EntityFramework Core 迁移忽略主外键关系
- delphi 关闭时缩小到托盘_delphi 实现最小化系统托盘
- android camera捕捉,通过android camera2 API捕捉4:3相机图片与16:9传感器阵列相机
- NYOJ 300 amp;amp; hdu 2276 Kiki amp; Little Kiki 2 (矩阵高速功率)
- access ea 可以联网吗_如何看待EA在STEAM上推出EA Play(原EA Access会员)?
- 前端|如何制作调查问卷
- css代码body>*是什么意思
- freemarker导出word文档中的复选框打钩功能
- 双击文件夹弹窗“找不到应用程序”,但是右键点击打开可以
- 电子科技大学计算机科学与技术考研复试,电子科技大学计算机科学与工程学院2021考研招生复试工作安排...
- 牛客小白月赛28 C-单词记忆方法——dfs
- ofo发布“小黄蜂”,想试试一贴即开的新体验吗
- statsmodels.formula数据使用predict()
- 51proteus仿真:生成方波、正弦波、锯齿波和三角波
- [系统安全] 二十六.WannaCry勒索病毒分析 (2)MS17-010漏洞利用及蠕虫解析
- 云贝餐饮o2o小程序-V2独立版【更新序列至2.5.1】独家修复商家登录/区域代理/分销商/会员卡/积分商城/文章/DIY (可线传)
热门文章
- 《windows 程序设计》中的翻译错误----学习笔记
- python爬虫实战之百度新闻爬取
- 使用html5+javascript+css实现单机版五子棋---跟电脑打没赢过
- linux命令之查看ip地址
- 超全面的JavaWeb笔记day01HTML等
- 刘涛入职阿里,花名刘一刀,担任聚划算官方优选官
- DRM驱动(一)之显示处理器介绍
- 亚马逊美国站12岁以下儿童产品 CPSIA测试标准
- Bootstrap JS插件使用实例(6)-折叠(手风琴效果)
- python爬虫破解百度文库_用Python爬取百度文库0下载券的免费文档详细步骤,附可执行软件...