Unity 图形学 基础知识总结

1. 渲染流水线

三大块:应用阶段,几何阶段,光栅化阶段

渲染图元   顶点信息

GPU流水线

顶点数据=>

顶点着色器;曲面细分着色器;几何着色器;裁剪;屏幕映射=>

三角形设置;三角形遍历;片元着色器;逐片元操作=>

屏幕图像

裁剪:可配置的,摄像机属性

逐片元操作:模板测试,深度测试,混合(不可编程,可以配置)

为了优化,Unity的Ztest是在片元着色器之前;

但是如果使用了clip(值为负数,丢弃像素信息 discard)函数,会关闭提前测试,导致需要处理的片元增加

2. 数学

齐次坐标系,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。

向量为 x,y,z,0 不能平移,没有位置的概念

点    为 x,y,z,1 可以平移,有位置的概念

点乘的几何意义是投影, |a||b|cos夹角

叉乘的几何意义是找和两个向量都垂直的新向量,计算公式是斜着一个一个乘起来

法线的坐标变换是比较特殊的,在非统一缩放时会出问题,U3D封装了接口 XXXXNormal

3. 标准光照模型

4个部分构成:自发光(emissive),高光(specular),漫反射(diffuse),环境光(ambient)

漫反射: 兰伯特模型  漫反射光的光强仅与入射光的方向和反射点处表面法向夹角的余弦成正比。

半兰伯特      0.5*(法线 点乘 光)+0.5

高光:     Phong模型   镜面反射光强与反射光线和视线的夹角a相关

Blinn Phong dot(V,R)换成dot(N,H),法线,半角向量(位于视线V和光线L的角平分线方向 H = (L + V) / | L+V |)

渲染队列

背景 1000

几何体 2000  透明度测试 2450

透明图混合(半透) 3000

延后 4000

Unity渲染路径

前向: 两个缓冲区信息:颜色,深度,模板

每个pass逐像素的计算一个光照的影响

分两种pass: ForwardBase(1个) ForwardAdd(n个)

延迟: 缓冲信息比较多:漫反射颜色,高光颜色,平滑度,法线,自发光,深度等信息

两个Pass:第一个写入缓冲,不进行任何光照计算;第二个pass利用Gbuffer中的信息计算光照

阴影

Shadow Map:把摄像机放在和光源重合的位置,光源的阴影就是摄像机看不到的地方

投射    使用LightMode中标签为ShadowCaster的Pass渲染到阴影映射纹理(深度纹理)中

接收    采样阴影纹理,与原本的颜色相乘

SHADOW_COORDS          v2f的结构体中声明阴影纹理坐标

TRANSFER_SHADOW       vert中计算纹理坐标,把模型空间转到阴影空间,再到纹理坐标空间

SHADOW_ATTENUATION  frag中取阴影纹理信息

这些宏使用有别的变量的命名限制

透明度剔除的可以投射阴影,半透明的不行(渲染顺序问题,会变得很复杂)

CubeMap:做反射,折射,菲涅尔反射(模型边界处反射)

Texture2D 可以用代码生成,改动,给材质使用

程序材质 sbsar 后缀名,用Substance Designer在Unity外部生成的

动画:uv动画,顶点位置动画, 就是用时间为参数改uv,顶点位置,顶点法向量什么的

批处理可能会破在模型空间计算的顶点动画效果, 可以用 DisableBatching 标签关闭

投射阴影不能用默认的Pass

屏幕后处理,OnRenderImage函数,用材质球算一次

边缘检测: 用边缘检测算子对图形进行卷积 算子类似 1,0,-1分别检测x和y轴 再取绝对值相加,大的就是边界

高斯模糊: 多次卷积,卷积结果就是像素的值,算子类似 0.05,0.25,0.4,0.25,0.05

Bloom:     高光扩散效果,提取高亮区域,对高亮区域做高斯模糊(需要一个新的RenderTexture),和原图混合

运动模糊: 保存上一帧的渲染结果,叠加到当前帧中或是用深度纹理重建速度来模拟运动模糊

Unity和图像处理类 Graphics类中常用函数

public static void Blit(Texture source, RenderTexture dest);  //屏幕后处理用的

public static void DrawMeshInstanced(Mesh mesh, int submeshIndex, Material material, Matrix4x4[] matrices); //GPU批次绘制Mesh

其他函数

Camera.RenderWithShader(Shader shader, string replacementTag) //该摄像机用某一shader绘制

深度纹理和法线纹理

延迟渲染会自动生成,前向会用着色器替换技术选择渲染队列小于2500的物体生成

深度纹理会直接读取深度缓存,法线贴图需要额外生成

使用噪声

消融,水面抖动等等

动态合批:

顶点属性总之小于900,相同模型材质,Shader支持合批

静态合批

勾上Batching Static就行了,也要求使用相同材质,会使得内存变大,静态合批之后不能再移动,变成一个大的mesh

shader LOD

shader的LOD值大于设定值后将不会被渲染

Shader.maximumLOD 设定,Diffuse为200

surface shader:

表面函数,光照函数,顶点函数,最终颜色修改函数

可以很方便的处理光照

时间: 2024-10-08 16:35:04

Unity 图形学 基础知识总结的相关文章

Unity 3D 基础知识方法

A. 组件中默认的方法有如下:            Awake,Start,Update,OnGUI,OnDisable,OnEnable,OnDestory,LateUpdate,FixedUpdate Awake 每当脚本被加载时调用,游戏对象拥有该脚本即执行,适合作为初始化操作 OnEnable 每次激活脚本时,调用 Start 在第一次调用Update 之前 调用Start方法 Update 每帧调用一次Update,常用来处理画面逻辑 OnDisable  禁用脚本时,调用 Late

计算机图形学基础知识

点乘计算角度.弧度. 差乘计算位置. 版权声明:本文为博主原创文章,未经博主允许不得转载.

【转】Unity资源管理原理知识(干货不嫌长)

最近unity 当需要频繁创建一个物体对象时,怎样减少内存. 这里写下关于Unity3D对于内存的管理与优化. Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大. Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时 动态加载,可以指定路径和来源的. 其实场景里所有静态的对象也有这么一个加载过程,只是Unity3D后台替你自动完

【Unity】基础知识结构总结

前言 本篇以知识结构图的形式对Unity引擎的经常使用基础知识内容进行了总结和梳理. 假设你学了一点关于Unity引擎的知识,又认为太杂乱,那么希望本篇会给你一些帮助. 相应引擎版本号:Unity  4.6.3 (前方多大图,非wifi用户慎点.) 博文首发 & 持续更新:http:// blog.csdn.net/duzixi 原文件请參见原文评论 知识体系结构图 引擎基本架构 人机交互 渲染系统 物理系统 网络编程 编辑器扩展 移动平台 后语 Unity引擎给我们提供了非常多强大的功能.本文

UNITY渲染基础

UNITY渲染基础 渲染 1.何为渲染? 所有我们能看到的东西都是需要进行渲染的. 比如:天空盒,场景模型,角色模型,特效...... 如果没有渲染,游戏世界将是一片黑暗. 2.各版本渲染区别 Unity4.X:渲染使用的事AutoDesk的Beast技术: Unity5.X:渲染使用的事Enlighten引擎: Unity5.6后:渲染使用的还是Enlighten引擎,但是有了升级: 3.移动端渲染 移动端的模型大多是使用两张类型的贴图作为渲染的素材: 一张是漫反射贴图,一张是法线贴图. 4.

Unity/C#基础复习(5) 之 浅析观察者、中介者模式在游戏中的应用与delegate原理

参考资料 [1] <Unity 3D脚本编程 使用C#语言开发跨平台游戏>陈嘉栋著 [2] @张子阳[C#中的委托和事件 - Part.1] http://www.tracefact.net/tech/009.html [3] @张子阳[C#中的委托和事件 - Part.2] http://www.tracefact.net/tech/029.html [4] @毛星云[<Effective C#>提炼总结]提高Unity中C#代码质量的22条准则 https://zhuanlan

MySQL数据库基础知识

day02 MySQL数据库基础知识 一.基础知识概述: 基础决定你这门课程的学习成败!只有学习好这些基础知识以后,你才能真正的运用自如.才能够对数据库有更深入的了解,道路才会越走越远. 二.基础知识: 1.数据库(database):数据库就好比是一个物理的文档柜,一个容器,把我们整理好的数据表等等归纳起来. 创建数据库命令:        create database 数据库名; 2.查看数据库         show databases; 3.打开指定的数据库         use 

linux入门基础知识及简单命令介绍

linux入门基础知识介绍 1.计算机硬件组成介绍 计算机主要由cpu(运算器.控制器),内存,I/O,外部存储等构成. cpu主要是用来对二进制数据进行运算操作,它从内存中取出数据,然后进行相应的运算操作.不能从硬盘中直接取数据. 内存从外部存储中取出数据供cpu运存.内存的最小单位是字节(byte) 备注:由于32的cpu逻辑寻址能力最大为32内存单元.因此32位cpu可以访问的最大内存空间为:4GB,算法如下: 2^32=2^10*2^10*2^10*2^2 =1024*1024*1024

BroadcastReceive基础知识总结

BroadcastReceive基础知识总结 1.BroadcastReceive简介 BroadcastReceive也就是"广播接收者"的意思,顾名思义,就是用来接收来自系统和应用中的广播 在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能,当网络状态改变时,系统会产生一条广播,接收到这条广播,就能及时的做出提示和保存数据等操作,当电池的电量改变的时候,系统会产生一条广播,接收到这条广播就能在电量低的时候告知用户