图形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 着色过程的更多相关文章

  1. Unity 着色器训练营(2) - MVP转换和法线贴图

    https://mp.weixin.qq.com/s/Qf4qT15s9bWjbVGh7H32lw 我们刚刚公布了Unity 2018.1中,Unity将会内置可视化编程工具Shader Graph, ...

  2. Unity 着色器

    Unity中定义了很多种Shader类型,同样的Shader类型我们可以自定义,需要用到ShaderLab着色语言. 一个3D图形是怎样显示在我们的视觉? 3D数据文件-----3D显示程序----- ...

  3. unity 着色器内置宏

    目标平台 Macro: Target platform: SHADER_API_D3D11 Direct3D 11 SHADER_API_GLCORE Desktop OpenGL “core” (G ...

  4. Unity 着色器基础知识

    一.着色器基础知识 着色器通过代码模拟物体表面发生的事情,其实就是GPU中运行的一段代码. 着色器的类型: 顶点着色器.片元着色器.无光照着色器.表面着色器.图像特效着色器.计算着色器. 坐标空间: ...

  5. Unity Shader着色器优化

    https://mp.weixin.qq.com/s?__biz=MzU5MjQ1NTEwOA==&mid=2247493518&idx=1&sn=c51b92e9300bcf ...

  6. Unity性能优化(4)-官方教程Optimizing graphics rendering in Unity games翻译

    本文是Unity官方教程,性能优化系列的第四篇<Optimizing graphics rendering in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...

  7. 【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&amp;颜色、光照与材质

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨)  ...

  8. unity文件解析以及版本控制

    刚开始使用unity做开发时,拿到一个范例工程先上传SVN,之后再自己做一些修改后,发现有非常多文件都有变化,这才知道有很多本地生成的文件,是不用上传的,但是不知道哪些才是需要共用的.之后又困扰于修改 ...

  9. Unity中 动态加载 Resources.Load()和Asset Bundle 的区别

    版权声明:本文为博主原创文章,未经博主允许不得转载. 初学Unity的过程中,会发现打包发布程序后,unity会自动将场景需要引用到的资源打包到安装包里,没有到的不会跟进去.我们在编辑器里看到的Ass ...

随机推荐

  1. oracle判断是否包含字符串的方法

    首先想到的就是contains,contains用法如下: select * from students where contains(address,  ‘beijing’) 但是,使用contai ...

  2. webpack始出来

    一直想好好整理一下webpack,现在就整理吧. 总结自己的实际搭建的整理情况,我还是要先对自己说一句,以后给文件夹起名字的时候不要用一些特殊的关键字,比如我在做这个demo的时候,我用的文件夹名称叫 ...

  3. c++ string去除首尾 空格、\n、\r、\t

    string s = " test "; size_t n = s.find_last_not_of(" \r\n\t"); if (n != string:: ...

  4. python基础数据类型—int、bool、字符串的常用方法

    1.int int为整型数据,主要用于计算和类型转化(将字符串转为数字) 常用方法 #bit_length()当用二进制表示数字时所用最少位数,如下十进制数12用二进制表示是1100(bin),所以# ...

  5. HTML中的元素定位

    static默认 relative相对定位 absolute绝对定位 mix relative and absolute混合相对定位和绝对定位 fixed固定定位 float浮动 reference ...

  6. 在 Activity 中实现 getContentView 操作

    2017/9/8 17:17:03   前言     最近接到个需要优化Android原生系统设置APK的任务.这个任务里面有一个更换应用背景图片的需求.我手里的这个设备是一个平板设备,使用了一下这个 ...

  7. Codeforces Round #539 Div. 1

    A:即求长度为偶数的异或和为0的区间个数,对前缀异或和用桶记录即可. #include<iostream> #include<cstdio> #include<cmath ...

  8. 【XSY2733】Disembrangle DP

    题目描述 有一个\(3\times n\)的网格,一些格子里已经有棋子了,一些格子里还没有. 每次你可以选择往一个没有棋子的格子里放一个棋子,但要满足这个格子上下两个格子都有棋子或左右两个格子都有棋子 ...

  9. 【XSY2668】排列统计 DP

    题目描述 给你一个长度为\(n\)的排列\(a\),每次要选择两个数,交换这两个数(这两个数可以相同).总共要交换\(k\)次. 最后要统计数列中有多少位置\(i\)满足\(\max_{j\leq i ...

  10. Python_sys.argv 命令行参数获取使用方法

    import sys print(sys.argv) """ 获取命令行参数 输入 python3 sys.argv_demo.py 输出: ['argv.py'] 输入 ...