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

本文共 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

你可能感兴趣的文章
[ JAVA编程 ] double类型计算精度丢失问题及解决方法
查看>>
好玩的-记最近玩的几个经典ipad ios游戏
查看>>
PyQt5--EventSender
查看>>
Sql Server 中由数字转换为指定长度的字符串
查看>>
tmux的简单快捷键
查看>>
[Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II
查看>>
php match_model的简单使用
查看>>
SIP服务器性能测试工具SIPp使用指导(转)
查看>>
Vue_(组件通讯)子组件向父组件传值
查看>>
STM32单片机使用注意事项
查看>>
移动开发平台-应用之星app制作教程
查看>>
leetcode 459. 重复的子字符串(Repeated Substring Pattern)
查看>>
springboot No Identifier specified for entity的解决办法
查看>>
浅谈 unix, linux, ios, android 区别和联系
查看>>
51nod 1428 活动安排问题 (贪心+优先队列)
查看>>
latex for wordpress(一)
查看>>
如何在maven工程中加载oracle驱动
查看>>
Flask 系列之 SQLAlchemy
查看>>
aboutMe
查看>>
【Debug】IAR在线调试时报错,Warning: Stack pointer is setup to incorrect alignmentStack,芯片使用STM32F103ZET6...
查看>>