博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity 着色过程
阅读量:5329 次
发布时间:2019-06-14

本文共 1738 字,大约阅读时间需要 5 分钟。

 

图形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的矩阵乘法

 

转载于:https://www.cnblogs.com/Optimism/p/10561524.html

你可能感兴趣的文章
BZOJ 2243: [SDOI2011]染色( 树链剖分 )
查看>>
BZOJ 1925: [Sdoi2010]地精部落( dp )
查看>>
c++中的string常用函数用法总结!
查看>>
界面交互之支付宝生活圈pk微信朋友圈
查看>>
[DLX精确覆盖+打表] hdu 2518 Dominoes
查看>>
SuperMap iServerJava 6R扩展领域开发及压力测试---判断点在那个面内(1)
查看>>
Week03-面向对象入门
查看>>
一个控制台程序,模拟机器人对话
查看>>
web.xml 中加载顺序
查看>>
pycharm激活地址
查看>>
hdu 1207 四柱汉诺塔
查看>>
Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(上篇——纯前端多页面)
查看>>
display:none与visible:hidden的区别
查看>>
我的PHP学习之路
查看>>
【题解】luogu p2340 奶牛会展
查看>>
对PostgreSQL的 SPI_prepare 的理解。
查看>>
解决响应式布局下兼容性的问题
查看>>
京东静态网页练习记录
查看>>
使用DBCP连接池对连接进行管理
查看>>
【洛谷】【堆+模拟】P2278 操作系统
查看>>