Unity 着色过程
图形API包括:OpenGL、Metal、Vulkan、Director3D。
渲染管线(图形管线)通用结构:
1、数据收集(图形的网格、纹理、材质)--------2、顶点着色器(获取图形的2D坐标)----------3、顶点的后处理(顶点的坐标变换、图形基元的裁剪,其实就是将不会在屏幕显示的部分裁剪掉)
--------4、图形基元的收集----------5、栅格化(不可编程阶段、接受三角形及其数据、形成潜在的像素-片源)-----------6、片源着色器----------7、输出合并检查
栅格化器:决定三角形覆盖了那些图像
无光照着色器的结构:
顶点数据收集到appdata结构体------顶点函数(Vertex Shader)--------顶点到片源(v2f struct)--------片源函数(Fragment Shader)-------最终颜色
appdata结构体:获取顶点的位置或者其他信息
struct appdata
{
float4 vertex : POSITION;
};
顶点函数:将顶点数据转化为栅格化器可以处理的数据
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
片源数据结构体:
struct v2f
{
float4 vertex : SV_POSITION;
};
片源函数:
fixed4 frag (v2f i) : SV_Target
{
return _Color;
}
坐标空间:
对象空间、世界空间、相机空间、裁剪空间、标准化设备坐标、屏幕空间;
对象空间:顶点位置处于对象空间;
世界空间:Transform使用的空间是世界空间;
相机空间:照相机拍摄的空间;
裁剪空间:将任何不在裁剪空间的图形基元裁剪掉,变化范围[-1,1],四维坐标其中的w轴用来解决两个平行线相交的问题,来决定是否被裁剪掉。
标准化设备坐标:2D空间,但是使用了3个值,z轴分量用于深度缓存。
屏幕空间:将NPC转换为适合于屏幕的空间。
坐标空间的相互转换:
比如从对象空间转化为世界空间,可以通过一些Unity内置的函数实现:
float3 UnityObjectToWorldDir(int float3 Dir) 对象空间的光线转化到世界空间
float3 UnityObjectToWorldNormal(int float3 norm) 对象空间的法向量转化到世界空间
通过内置的矩阵可以实现将模型在对象空间的顶点位置转化到世界空间,这样的矩阵比如:unity_ObjectToWorld、unity_WorldToObject、unity_WorldToCamera,具体是通过mul函数实现:
float4 vertexWorld=mul(unity_ObjectToWorld,v.vertex);
内置函数的底层实现:
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
其实函数UnityObjectToClipPos()=mul(UNITY_MATRIX_MVP,*),MVP矩阵代表Matrix*View Matrix*Projection Matrix的矩阵乘法
Unity 着色过程的更多相关文章
- Unity 着色器训练营(2) - MVP转换和法线贴图
https://mp.weixin.qq.com/s/Qf4qT15s9bWjbVGh7H32lw 我们刚刚公布了Unity 2018.1中,Unity将会内置可视化编程工具Shader Graph, ...
- Unity 着色器
Unity中定义了很多种Shader类型,同样的Shader类型我们可以自定义,需要用到ShaderLab着色语言. 一个3D图形是怎样显示在我们的视觉? 3D数据文件-----3D显示程序----- ...
- unity 着色器内置宏
目标平台 Macro: Target platform: SHADER_API_D3D11 Direct3D 11 SHADER_API_GLCORE Desktop OpenGL “core” (G ...
- Unity 着色器基础知识
一.着色器基础知识 着色器通过代码模拟物体表面发生的事情,其实就是GPU中运行的一段代码. 着色器的类型: 顶点着色器.片元着色器.无光照着色器.表面着色器.图像特效着色器.计算着色器. 坐标空间: ...
- Unity Shader着色器优化
https://mp.weixin.qq.com/s?__biz=MzU5MjQ1NTEwOA==&mid=2247493518&idx=1&sn=c51b92e9300bcf ...
- Unity性能优化(4)-官方教程Optimizing graphics rendering in Unity games翻译
本文是Unity官方教程,性能优化系列的第四篇<Optimizing graphics rendering in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...
- 【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&颜色、光照与材质
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨) ...
- unity文件解析以及版本控制
刚开始使用unity做开发时,拿到一个范例工程先上传SVN,之后再自己做一些修改后,发现有非常多文件都有变化,这才知道有很多本地生成的文件,是不用上传的,但是不知道哪些才是需要共用的.之后又困扰于修改 ...
- Unity中 动态加载 Resources.Load()和Asset Bundle 的区别
版权声明:本文为博主原创文章,未经博主允许不得转载. 初学Unity的过程中,会发现打包发布程序后,unity会自动将场景需要引用到的资源打包到安装包里,没有到的不会跟进去.我们在编辑器里看到的Ass ...
随机推荐
- 模型的CURD操作
class Index { public function index() { return '<h3>欢迎来到PHP中文网</h3>'; } public function ...
- MyISAM索引和InnoDB索引的区别
首先你要知道: 无论是Myisam和Innodb引擎,如果在建表的时候没有显示的定义一行主键列的话,他内部都会自动创建一个隐藏的主键索引: 主键索引以外的索引假设称为次索引:首先Myisam和Inno ...
- Windows Server2008、IIS7启用CA认证及证书制作完整过程
1 添加活动目录证书服务 1.1 打开服务器管理器,右键点击角色,选择“添加角色”,在“添加角色向导”窗口左侧面板选择“服务器角色”,然后勾选“Active Dire ...
- Linux命令归纳
Linux基本命令 Linux Xshell远程连接 ssh 用户名@id地址 例如: ssh root@192.168.11.53 增加类指令 创建文件夹 mkdir 文件名 mkdir -p 路径 ...
- Newtonsoft.Json 概述
有时候,在前后台数据交互或者APP与后台交互的时候,我们通常会使用Json进行数据交互,为此会使用到Newtonsoft.Json.dll 这个类库,这个类库非微软官方,但是下载量已经超过了数十万次, ...
- codeforces 1065F Up and Down the Tree
题目链接:codeforces 1065F Up and Down the Tree 题意:给出一棵树的节点数\(n\)以及一次移动的最大距离\(k\),现在有一个标记在根节点1处,每一次可以进行一下 ...
- 【UOJ348】【WC2018】州区划分 状压DP FWT
题目大意 给定一个\(n\)个点的无向图,对于每种 \(n\) 个点的划分\(\{S_1,S_2,\ldots,S_k\}\),定义它是合法的,当且仅当每个点都在其中的一个集合中且对于任何的\(i\i ...
- 【BZOJ4042】【CERC2014】parades 状压DP
题目大意 给你一棵\(n\)个点的树和\(m\)条路径要求你找出最多的路径,使得这些路径不共边.特别的,每个点的度数\(\leq 10\). \(n\leq 1000,m\leq \frac{n(n- ...
- hdu 5877 Weak Pair (Treap)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5877 题面; Weak Pair Time Limit: 4000/2000 MS (Java/Other ...
- php 排序数组array_multisort
$arr[] = array('name'=>'a','flag'=>1); $arr[] = array('name'=>'b','flag'=>2); $arr[] = a ...