
Unity
文章平均质量分 76
白梦刃
The hard part is deciding.
展开
-
Unity切线空间转换
切线空间是一个非常重要的空间。这体现在两个点,首先它的xy方向是UV方向,所以将纹理坐标和空间坐标建立了关联。其次它的z方向是法线,这很方便基于切线空间定义法线贴图。所以它的用途一个是用来处理法线贴图,这非常常用。另外就是可以利用它和贴图UV对应,比如视差贴图可以用来确纹理坐标定偏移。它是Unity坐标系中唯二使用右手坐标系的空间,另外一个是观察空间。这很容易看出来,Unity中纹理坐标是从左下角开始的,往右侧是U方向,往上是V方向,按照右手定则Z轴是正方向。本文主要分析切线空间与其他空间的转换。原创 2023-04-18 11:24:19 · 1366 阅读 · 2 评论 -
Unity模型正反面
有个很常见的概念——正反面。我们经常使用这个概念,比如Unity的cull命令:Unity中的正反面是由顶点顺序(winding order)决定的,Mesh的每个顶点都有一个索引,三角形包含三个顶点的索引。按照索引从大到小遍历,会产生两种情况:如果Mesh的顶点顺序是顺时针,就认为是正面;如果Mesh的顶点顺序是逆时针,就认为是反面。如上图,左侧三角面顶点分别是012,遍历顺序逆时针为反面。右侧三角面顶点分别是021,遍历顺序顺时针为正面。原创 2023-04-13 00:05:06 · 1594 阅读 · 0 评论 -
Unity Job System基本介绍
3. 依赖于blittable-types,不能使用引用类型。并且常用的一些数据需要改写成vector types以利用Burst对SIMD指令的优化,需要尽量使用Unity.Mathematics类型代替旧的类型,这种替换和改写需要工作量。1. 需要自己手动控制资源回收,这个过程需要更加小心,因为C#不再会做安全性检查,需要由开发者自己保证资源回收正确。2. 跟线性流程不同,我们必须手动控制多线程依赖关系,保证资源同步并且不会发生竞争。适合处理成为CPU瓶颈,并且依赖性不强,可以通过并发优化的工作。原创 2023-04-08 10:02:14 · 384 阅读 · 0 评论 -
Unity OnValidate使用
OnValidate方法是一个仅限编辑器的函数,在Unity加载脚本或检查器中的值更改时调用。4. 更改GameObject active状态不会调用OnValidate,只有OnDisable和OnEnable会被调用。1. OnValidate不受播放模式影响,只要其值发生变化,在非播放状态下也会被调用(可以用于非播放模式修改参数后更新)。5. 初始加载时,无论enabled状态和active状态如何,都会被调用多次。2. 不受enabled状态影响,即使其所在的脚本被禁用,修改值时也会被正常调用。原创 2023-04-07 16:26:53 · 4073 阅读 · 0 评论 -
Unity Transform与Hierachy
Editor左上角有一个Tool Handle Position,有两个选项,Pivot和Center,Center是指相对当前选中物体的中心,是渲染包围盒的中心。也就是说,为了得到子物体的模型变换矩阵,Unity需要将各自Transform的矩阵做相乘,从最后的层级逐项往上累乘,当层级过多时,这不可避免会产生一些成本。当选中多个物体时, Center代表围绕所有物体的中心(中心位置是所有物体的包围盒中心)旋转,而Pivot代表围绕每个物体各自的原点。上面给出的矩阵运算顺序是左乘,需要从右往左阅读。原创 2023-04-06 22:49:34 · 303 阅读 · 0 评论 -
Unity Compute Shader介绍和用法
但有的时候我们不想这样,而是每次写入数据的位置是可变的,并且可能在一次绘制当中,覆盖之前写好的像素。用上面的方法,可以实现非常高效的Instancing,因为此时CPU向GPU传递的数据大大减少了,不再需要每帧为每个物体传递位置信息,甚至不用传递mesh(DrawProcedural的情况)。compute shader没有subpass和pass,也没有renderqueue,这是因为它固定在GPU渲染流程开始时进行,不直接创建drawcall,而是其输出在后面的渲染阶段使用。原创 2023-04-06 15:27:12 · 1480 阅读 · 0 评论 -
Unity Procedural Instancing材质属性无效问题解决
这一行加了一个static标注,意味着此时定义的所有材质属性变量都成了static,但是static变量意思是其值是不可改变的,无法被Shader或者Material的SetFloat,SetColor...之类的方法修改,更要命的是,这种定义方式加上了分号也杜绝了直接赋值,变量被固定初始化为0,而不是在材质中配置好的属性值。2. 在做Procedural Instancing时,定义的shader不要UNITY_INSTANCING_XXX的语法,直接定义变量就可以。原创 2023-04-05 17:45:58 · 748 阅读 · 0 评论 -
Unity Mesh从obj文件到GPU
在之前的法线和UV坐标数据中可以看到,顶点和这些数据存在一对多的关系,以正方体为例,每个顶点对应3个方向的法线,在UV数据中,有14-8=6个重复顶点。可以看到顶点数发生了变化,原本只有8个顶点,现在变成了24个,每个顶点有其自身的normal、tangent和uv,占用空间变成了24*(12+12+16+8)/1024=1.125KB。每个面可以包含三个(三角面)或更多元素(四边面或者多边形面),每个元素的顶点是必须的,后面的vt(纹理坐标)和vn(法线)是可选的。纹理坐标为什么是14个?原创 2023-04-05 09:23:41 · 381 阅读 · 0 评论 -
Unity垂直同步:帧率和刷新率
帧率(英语:frame rate)是用于测量显示帧数的度量。测量单位为“每秒显示帧数”(frame per second,FPS)或“赫兹”,一般来说FPS用于描述视频、电子绘图或游戏每秒播放多少帧。显示器的刷新率是指显示器每秒绘制新图像的次数。其单位为赫兹 (Hz)。例如,如果您的显示器刷新率为 144 Hz,这是指它每秒钟会刷新图像 144 次。帧率直接依赖于显卡的输出速度,跟渲染速度有关,取决于CPU和GPU侧的性能,GPU瓶颈和GPU瓶颈都会导致帧率下降。原创 2023-04-03 20:53:48 · 3937 阅读 · 1 评论 -
Shadertoy导出到Unity
ShaderToy是一个很棒的Shader网站Shadertoy BETA,里面有很多很好的效果可以参考。它提供了一个网页编辑工具,可以很方便的查看和保存shader。 但是它也存在一些缺点: 1.没有调试功能,只能使用简单的假彩色ShaderMan是一个将ShaderToy转换成CG/HLSL语言的工具,这一步可以直接得到转换后的Material和Shader,使用方法参考其介绍,到这一步已经可以将材质应用于物体查看效果。原创 2023-03-22 14:12:41 · 648 阅读 · 0 评论 -
Unity动态模糊理论和实现
这告诉我们要如何做动态模糊,需要将当前点和之前若干像素取平均值。这有个隐含参数是需要平均的像素点的个数N,这取决于曝光时间,时间越长,t越大需要平均的像素点越多。动态模糊-历史缓存Blend 首先是比较简单的实现方式,从原理分析出发,那么可以保存这N帧的图像然后对相邻N帧取平均。但直接创建N个缓存贴图成本太高,可以只使用一个缓存用Blend代替另外一种方法不需要使用中间缓存,而是作为一种后处理效果直接在屏幕空间实现,需要计算速度向量,根据重投影来计算像素速度原创 2023-03-20 20:17:42 · 1854 阅读 · 0 评论 -
Unity SRP世界空间重建
世界空间重建解决的是:当我们在不透明物体渲染完成,想要知道深度缓存中保存当前渲染的物体的世界空间位置。这个功能还是比较常用的,一些后处理效果比如雾效,ScreenSpace效果都基于此。 重建世界空间有两种情况,一种是基于后处理的,我们已经在屏幕空间了,不再是渲染场景中的物体而是直接处理屏幕输出。还有一种是基于场景已有物体渲染的,比如透明物体渲染。本文介绍这两种重建方法在SRP中的实现。原创 2023-03-17 21:30:28 · 2215 阅读 · 0 评论 -
Unity Editor绘制时分辨率减一
复现环境:Unity 2021.3.16 SRP 在测试FXAA时发现一个bug,Unity Editor中渲染的CameraTarget的分辨率,和camera.pixelWidth并不相同,前者比后者少1。原创 2023-03-15 02:34:50 · 501 阅读 · 0 评论 -
Unity FXAA Edge Blending细节分析
分析Unity FXAA的Edge Blending的实现细节,可以有效缓解阶梯形走样,解决中间边界采样与手动平均不匹配的问题原创 2023-03-13 23:36:29 · 415 阅读 · 0 评论 -
Unity SRP Batcher报错
Unity SRP Batcher报错 Builtin property offset in cbuffer overlap other stages原创 2023-02-03 16:19:52 · 548 阅读 · 0 评论