
Unity Shader
文章平均质量分 91
上午八点
要学的东西太多了
展开
-
基于Unity默认烘焙系统产出Ambient Occlusion, Sky Occlusion等数据
使用Unity默认烘焙系统,产出Ambient Occlusion,Sky Occlusion 及其他贴图,用于间接光着色计算。原创 2022-09-30 11:37:16 · 2183 阅读 · 0 评论 -
URP中增加屏幕空间阴影开关
阴影实现过程在UniversalRenderPipeline中(以下简称URP),默认使用的是屏幕空间阴影(Screen Space Shadow), 通过 ScreenSpaceShadowResolvePass 这个类来实现,如果不想使用该阴影的话,就需要修改URP的代码。首先要明确屏幕空间阴影的实现过程,生成阴影图,_MainLightShadowmapTexture 生...原创 2020-02-28 17:09:09 · 3559 阅读 · 0 评论 -
实现自定义阴影过程中,方向光的view矩阵的构建方式
概述在实现自定义阴影的过程中需要构建把物体从世界空间转到方向光的投影空间,和常规的M V P 变换思路一样,只不过这里的 V空间 和 P空间 变成了以 方向光为坐标原点的空间,而常规的V P空间是以摄像机为坐标原点。下面主要说明的是 变换到方向光空间的view矩阵,常用的有四种方式。Camera.worldToCameraMatrix 方式实现逻辑如下:建立一个Camera物体,放到...原创 2019-09-01 12:08:02 · 997 阅读 · 0 评论 -
#if #ifdef #if defined 等几种常用的预处理指令的区别
#if #ifdef #if defined 等几种常用的预处理指令的区别在写shader时经常会出现一些预编译指令比如 #if #ifdef #if defined 等,有的时候会感到困惑,所以决定仔细查一下具体的使用方法,并做一个简单的测试。#define#define 指令用于定义一个宏或者常量#define 有两种常用的格式:#define identifier token...原创 2019-08-06 15:03:02 · 6125 阅读 · 0 评论 -
全屏三角形,HDUtils.DrawFullScreen 方法的理解
概述在HDRP的后处理系统中,具体来说就是 PostProcessSystem 类中,在绘制全屏后效时调用了几次 HDUtils.DrawFullScreen 方法,跳转到定义发现有五个重载的方法,但是最终都是通过调用 commandBuffer.DrawProcedural 方法来实现画三角形的,具体的调用是这样的:commandBuffer.DrawProcedural(Matrix...原创 2019-05-16 22:07:12 · 1866 阅读 · 1 评论 -
贴花的一些细节补充
在研究通过HDRP中自带的Decal Projector Component组件来实现贴花效果的过程中,遇到了一些需要理解的地方,以下列出一些关键步骤来说明贴花过程中的细节问题。DBufferRender 阶段1. 根据渲染管线中贴画的设置决定是否要使用四张RenderTexture作为渲染目标。调用ClearAndSetTargets2. 设置当前渲染目标并clear,使这些...原创 2019-02-22 13:21:12 · 895 阅读 · 0 评论 -
Unity Shader 中获取屏幕坐标
项目中有时会有一些效果需求,如重建片元在世界空间的坐标或者对屏幕指定区域进行颜色操作等,这时就需要获取到片元对应的屏幕坐标(Screen Space Coordinate)。在Unity中有三种方法可以获取到屏幕坐标。SV_POSITION 语义的xy变量struct v2f{ float4 pos : SV_POSITION; float2 uv : TEXCOORD0; ...原创 2019-02-02 10:44:26 · 12418 阅读 · 6 评论 -
HDRP中获取深度值
在 上一篇 中试图在HDRP中使用自定义的Shader来实现贴花效果,但是在读取深度图来获取深度值时出现了问题,在HDRP中深度图的组织方式发生了改变,变成了多个lod的深度图的图集,像下图这样 。 因此使用原有的 SAMPLE_DEPTH_TEXTURE 方法获取到的深度值变的不正确了。通过在ScriptableRenderPipeline工程的源码中查找加翻阅,发现在 ShaderPass...原创 2019-01-22 12:27:49 · 2936 阅读 · 5 评论 -
HDRP中的贴花效果
上一篇 中介绍了在默认渲染管线中贴花效果的实现原理。原本在默认管线中工作正常的Shader在导入到使用了HDRP的工程中后效果变的很错乱,大概是这样:直观感觉应该是深度值的原因导致重建世界坐标时出现了错误,在用Frame Debug查看具体的渲染过程后发现深度图是这样的:在HDRP中深度图的存储有点类似于一个mipmap的图集,里面存储了不同分辨率的多张深度图,所以使用 SAMPLE_D...原创 2019-01-18 12:37:42 · 4698 阅读 · 0 评论 -
Unity Decal 贴花效果测试
贴花效果,就和名字的直接意思类似,把一张图贴到另一个物体上显示,经常被用于表现一些重复出现的图案,比如弹孔,涂鸦,污渍等。效果图:常规贴花实现Unity官方提供了一个工程这个工程主要是用来说明CommandBuffer是怎么使用的,其中有贴花的一些展示,主要是用CommandBuffer在Deferred渲染路径下实现贴花效果。使用CommandBuffer是因为需要把BuiltinRend...原创 2019-01-17 18:40:46 · 13943 阅读 · 10 评论 -
Compute Shader 功能测试(二)
在上一篇 中使用ComputeShader进行了向量和矩阵的相乘计算,然后在C#代码中通过ComputeBuffer.GetData方法从GPU中读取计算结果,这个方法是一个同步操作,即调用时会堵塞调用线程,直到GPU返回数据为止,所以在需要读取的数据量很大时会有比较高的耗时,会导致游戏卡顿影响体验。Google了一番法线有异步的方法可以调用,在Unity2018版本以后增加了AsyncGPUR...原创 2019-01-02 21:16:28 · 3407 阅读 · 0 评论 -
GPU Instancing 功能测试
GPU Instancing 用于减少渲染大量相同物体时的DrawCall,同样减少DrawCall的方式有 Dynamic Batching 和 Static Batching,这两种方法都存在一些限制。Dynamic Batching :只能处理小于900个顶点属性的物体,必须使用同一个材质球等Static Batching:内存占用比较大,物体不能移动等Batch数量对比以下两张图是...原创 2018-12-18 15:30:12 · 5132 阅读 · 5 评论 -
CGINCLUDE 关键字的作用
在shader代码里经常会看到有这个关键字:CGINCLUDE,不注意的话很可能会和 CGPROGRAM 搞混淆,虽然这两个关键字都需要 ENDCG 来结束生效范围。在 CGINCLUDE 和 ENDCG 范围内可以插入一些shader代码,比如变量声明,结构体定义,函数实现等,如下:CGINCLUDEsampler2D _MainTex;struct vertex_data{ f...原创 2018-12-10 19:49:12 · 1945 阅读 · 0 评论 -
Compute Shader 功能测试
Compute Shader 可以在通常的渲染管线之外运行,执行一些大量的通用计算(GPGPU algorithms),因此可以联想到把一些大量相互之间没有关联的计算转移到GPU中进行,以减轻CPU的工作量。Compute Shader 实例#pragma kernel FillWithRedRWTexture2D<float4> res;[numthreads(1,1,1...原创 2018-12-20 21:02:34 · 1751 阅读 · 0 评论 -
Unity Shader实现运动模糊(二) : 物体运动产生模糊
上一篇 关于运动模糊的效果是根据VP矩阵重建世界空间坐标,然后根据上一帧和当前帧的位置差作为速度方向,这种方式需要摄像机有位移才能产生效果,如果摄像机静止不动,那么VP矩阵也就不会有变化,所以上一帧和当前帧在NDC空间的位置也没有变化,即speed==0,也就不会有运动模糊的效果,而想要在摄像机不动而物体移动时产生模糊效果,则需要另一种实现方式,这种方式更简洁直观。大致思路是:C#中记录运动...原创 2018-12-14 15:00:05 · 2971 阅读 · 2 评论 -
Unity Shader 实现磨皮效果
最近在做一些UI使用的shader,大部分是对UV进行一些操作,今天看需求文档时发现美术同学的要求里有一项是类似磨皮的效果,本来我也比较好奇这些美颜效果都是怎么做的,所以就趁此机会实验以下。查了一大堆页面后发现可以实现磨皮效果的算法有很多,常用到的有 双边滤波器、表面模糊方法、选择性模糊方法等。勉强看明白了双边滤波和表面模糊方法的公式,所以以下就使用这两种方法在Unity中实现下磨皮效果。双边滤...原创 2018-12-06 21:24:30 · 2977 阅读 · 2 评论 -
Texture2DArray 功能测试
在使用GPU Instancing时,如果要给每个物体设置不同的贴图,直觉的想法是使用 MaterialPropertyBlock对象设置一个Texture对象数组,类似 GPU Instancing测试 这篇里写给每个物体设置不同颜色的方式(MaterialPropertyBlock.SetVectorArray),如果有一个MaterialPropertyBlock.SetTextureArr...原创 2018-12-19 18:00:26 · 6710 阅读 · 0 评论 -
Unity Shader实现运动模糊(一) : 摄像机运动产生模糊
运动模糊是个经常会用到的效果,常见的实现步骤是:对深度纹理进行采样,取得当前片元的深度信息根据深度信息建立当前片元的NDC空间的坐标curNDCPos把curNDCPos乘以当前VP矩阵的逆矩阵(即View*Projection)-1,得到当前片元的世界空间坐标WorldPos把WorldPos乘以上一帧的VP矩阵(即View*Projection),得到上一帧在裁切空间中的位置 la...原创 2018-12-13 14:34:21 · 3256 阅读 · 2 评论