图形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. Laravel从入门到精通

    1. Laravel框架的下载安装 例如: 在D:\test\laravel目录下新建一个目录为test_laravel 第一步,下载laravel框架 在D:\test\laravel\test_l ...

  2. Java之ArrayList自定义排序,通过实现comparator比较器接口

    两种排序方式: 1.实体类实现Comparable接口,重写compareTo(T o)方法,在其中定义排序规则,那么就可以直接调用Collections.sort()来排序对象数组 2.在调用方法的 ...

  3. sqlserver数据库性能测试方法

    测试计划-添加jdbc jar 地址(数据驱动) jdbc configuration 地址 jdbc:sqlserver://127.0.0.1:1433;databasename=XSData j ...

  4. Python包的相对导入时出现问题解决

    资料参考: https://www.cnblogs.com/ArsenalfanInECNU/p/5346751.html 在python导入包,如下: from .units import * 经常 ...

  5. (转载)C#使用MemoryStream类读写内存

    MemoryStream和BufferedStream都派生自基类Stream,因此它们有很多共同的属性和方法,但是每一个类都有自己独特的用法.这两个类都是实现对内存进行数据读写的功能,而不是对持久性 ...

  6. SELECT IDENT_CURRENT(tableName)和自增长列的纠结

    项目中要用到一个功能:主表主键为自增长,要求在插入主表数据前先获得主表要插入数据的主键ID值,用在插入子表时获取主键ID.在网上搜了一下,发现SELECT IDENT_CURRENT(TableNam ...

  7. Memcached cas 陷阱

    本地使用的 php7环境,测试好上传到服务器后发现memcached get 报错,服务器上是php5环境: 出错代码如下: $memConnect->get($key,null, Memcac ...

  8. 神烦之float

    另外一篇文章 : css float 一 历史 Float的设计初衷仅仅是:文字环绕效果(向word中的文字环绕效果) 二 特性 1.包裹性:块级元素如果不设置float,它默认会撑满整个屏幕,而如果 ...

  9. 遍历map中的内容

    Map<String, CartItem> cartItems = cart.getCartItems();for(Map.Entry<String, CartItem> en ...

  10. hdu-2087(kmp)

    题意:模板题,在第一个串中有几个第二个串 解题思路:板子题,拿来练手的: 代码: #include<iostream> #include<algorithm> #include ...