- 博客(43)
- 资源 (2)
- 收藏
- 关注
原创 IBL的完整过程
将CubeMap的每个像素当成一个光源。漫反射IBL预计算出一个新的cubemap,存储了用卷积计算的每个采样方向ωo的漫反射积分结果。镜面的IBL镜面反射部分依赖于入射光方向和视线入射方向,尝试实时计算有入射光和所有入射视线的积分是几乎不可能的。使用预卷积镜面反射部分的方法:分裂和近似法。加入粗糙度,根据不同的粗糙度等级,在预过滤环境图的mipmap等级存储更模糊的结果。需要用到两个输入:法线和视线向量。卷积环境图并不知道视线防线,所以采用了一种妥协:V=R=N假设所有方向的入
2021-06-04 16:14:41
714
原创 玉石效果(半透明透射)的实现步骤
透射光线dot(-L, V)L : 光源方向V : 视角方向边缘透射偏转vLTLight = vLight + vNormal * fLTDistortion通过法线N和偏转系数 f 的引入,使得边缘处得透射效果增强。透射强调与衰减power(dot(-H, V), iLTPower) * iLTScale点光的支持URP的额外光的光照计算GetAdditionalLightsCount()……材质的透射厚度反转法线制作反转后的AO图1-AO可以用作厚度计算高光反射.
2021-03-12 10:23:59
901
原创 能量罩的制作拆解(URP)
交接处检测高亮使用屏幕坐标采样深度图,比较球体view空间下的Z值和场景的深度信息depth,如果depth > positionVS.z(右手坐标系的z都是负数,所以减法变加法),表示处于遮光罩内,而且越靠近交界处,这个差值越小,用1 - 差值,再乘以一个边缘系数就可以得到边缘信息。half4 hightlight = depth + i.positionVS.z;hightlight *= _HighLightFade;hightlight = 1 - hightlight;hight.
2021-03-02 10:11:25
605
原创 GPU实例化的详细步骤
GPU Instancing用于对多个对象(网格一样,材质一样,但是材质属性不一样)合批,单个合批最大上限为511个对象。硬件要支持:OpenGL3.0以上支持。C#代码:GameObject tree = Instantiate(prefab, pos, transform)shader 实现#pragma multi_compile_instancing 添加此指令后会使材质面板上曝露Instaning开关,同时会生成相应的Instancing变体UNITY_VERTEX_INPUT_
2021-02-23 15:35:02
1082
原创 Unity不同合批方式的使用场景及规则
Dynamic Batching动态合批是Unity默认执行的,我们无法修改Unity的合批规则,只能尽量让游戏场景内的物体符合合批规则。动态合批规则材质相同是合批的前提。但是如果是材质实例的话,则一样无法合批。支持不同的网格合批。单个网格最多300个顶点,900个顶点属性。镜像的transform无法合批。Lightmap对象无法合批。合批上限是2^16Static Batching静态合批也需要使用相同的材质,然后Static标记为Batching Static。静态合批的顶点
2021-02-23 15:32:50
1466
原创 Unity Shader通用优化方法
fixed/half/float位置坐标、纹理坐标类使用float。HDR颜色、方向向量类使用half。普通纹理、颜色类使用fixed。现代桌面级GPU都是直接采用float, 不需要考虑性能。现代移动端GPU大多支持half和float, 所以能用half就用half。能在顶点着色器中处理的就在顶点着色器少用多Pass小心使用AlphaTest和ColorMaskAlphaTestclip(),通常大多数平台使用AlphaTest会有性能优势,但在IOS和某些使用PowerVR GPU
2021-02-22 15:41:51
402
原创 Unity全局照明.md
GI全局照明:直接光照 + 间接光照Unity 中的GI技术预计算实时GI把需要的数据提前烘培好,运行时再进行读取。烘培GI把光源对静态物体的光照效果提前烘培到一张lightmap,然后把lightmap采样到物体表面以产生全局光照效果。###LightMap静态物体使用 bake lightmapLight Probes光照探针是为了让动态物品也可以受bake GI的影响。与光照贴图类似,光探针存储有关场景中光照的“烘焙(baked)”信息。不同之处在于,光照贴图存储的是场景中光照射
2021-01-25 15:18:36
246
原创 Unity shader常用动效合集(流动/遮罩/溶解/扰动/边缘光)
Shader "TAClass/CommonEffects"{ Properties { [Header(Render)] [Enum(UnityEngine.Rendering.BlendMode)]_SrcBlend("Src Blend",int) = 0 [Enum(UnityEngine.Rendering.BlendMode)]_DstBlend("Dst Blend",int) = 0 [Enum(UnityEn
2021-01-13 14:36:59
2316
原创 Unity深度缓冲区指令
深度信息深度值从摄像机的近裁剪面到远裁剪面,范围[0 - 1],呈非线性变化。深度缓冲区每个顶点的深度信息,在光栅化阶段被差值,并写入到深度缓冲中。ZWrite默认ZWrite OnZTestLess | Greater | LEqual | GEqual | Equal | NotEqual | Never | AlwaysOffset 深度偏移Offset Factor, Units深度偏移,offset = (m * factor) + (r * units),默认值为0,0
2021-01-05 14:52:30
687
原创 Unity模板测试Stencil
Stencil模板缓冲区(StencilBuffer)可以为屏幕上的每个像素点保存一个无符号整数值,这个值的具体意义视程序的具体应用而定.在渲染的过程中,可以用这个值与一个预先设定的参考值相比较,根据比较的结果来决定是否更新相应的像素点的颜色值.这个比较的过程被称为模板测试.将StencilBuffer的值与ReadMask与运算,然后与Ref值进行Comp比较,结果为true时进行Pass操作,否则进行Fail操作,操作值写入StencilBuffer前先与WriteMask与运算.公式:(Ref
2020-12-16 10:49:19
842
1
原创 Unity Shader 屏幕抓取,屏幕坐标
GrabPass(“Name”)抓取屏幕,抓取后名字为Name屏幕坐标获取屏幕坐标有3种方法:#####SV_POSITION语义的xy使用SV_POSITION语义,在片元着色器中拿到的pos.xy就是屏幕空间的坐标。struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0;};#####VPOS语义VPOS语义和SV_POSITION冲突,使用VPOS语义,则v2f不能定义SV_POSITION。fi
2020-12-11 16:57:51
1045
原创 Unity渲染队列
渲染队列数字小于2500的对象认为是完全不透明(从前往后渲染),高于2500的被认为是半透明物体(从后往前渲染)。“Queue” = “Background”值1000,此队列最先渲染。“Queue” = “Geometry”值2000,通常是不透明物体。“Queue” = “AlphaTest”值2450,透贴,要么完全透明,要么完全不透明。“Queue” = “Transparent”值3000,常用于半透明对象,要混合的对象。“Queue” = “Overlay”值4000,最后渲
2020-12-11 16:55:47
1134
原创 Unity Shader 变体multi_compile/shader_feature
优缺点优点:可以将多个功能集成到一个shader内。缺点:变体数量过多会导致记载时间过长与内存占用增加。变体类型multi_compile: 无论如何都会编译的变体(根据开关使用)。shader_feature: 通过材质的使用情况来决定是否编译的变体。multi_compile#multi_compile NAME 变体名字全部大写#if NAME xxx#endifInspector开关[Toggle]Name 名字一样,大小写不限
2020-12-10 15:32:53
456
原创 Unity 缓冲区
帧缓冲区用于存放一帧中数据信息的容器。片段着色器在写入帧缓冲之前会进行一系列测试:Alpha测试、模板测试、深度测试…,这些测试决定当前像素是否需要写入帧缓冲。片段在写入帧缓冲之时会进行一些操作:混合。显示器的扫描方式:随机扫描显示器(基本被淘汰)和光栅扫描显示器(逐像素扫描显示)。帧缓冲分为单缓冲和双缓冲两种方式,双缓冲为了解决一帧绘制数据太慢,没有绘制完就绘制下一帧的问题。帧缓冲区包括:Depth Buffer、Color Buffer、Stencil Buffer、自定义缓冲区。颜色缓
2020-12-10 13:53:19
840
原创 Unity Shader常用内置函数
函数功能示例abs绝对值frac取小数floor向下取整ceil向上取整max取最大值min取最小值power次方power(a, 3)rcp倒数expene^nenexp22n2^n2nfmod取余fmod(5, 2)saturate把值限制在0-1clamp把值限制在起始值和结束值之间clamp(x, start, end)sqrt平方根rsq...
2020-12-09 16:14:16
3532
3
原创 PBR反射率公式推导过程
反射率公式Lo(p,ωo)=∫Ωfr(p,ωi,ωo)Li(p,ωi)n⋅ωidωiL_o(p,\omega_o) = \int\limits_{\Omega} f_r(p,\omega_i,\omega_o) L_i(p,\omega_i) n \cdot \omega_i d\omega_iLo(p,ωo)=Ω∫fr(p,ωi,ωo)Li(p,ωi)n⋅ωidωi辐射率L解析Li(p,ωi)L_i(p,\omega_i)Li(p,ωi)在指定方向上的单位立体角和垂直此方向的
2020-11-23 11:52:49
2998
原创 Unity--后处理
亮度颜色值×亮度系数color * brightness饱和度使用特定系数,计算出一个饱和度0的颜色。使用插值lerp计算不同的饱和度。对比度对比度为0时的颜色值,各分量为0.5。使用lerp计算不同的对比度表现。边缘检测通过卷积计算卷积核与卷积。使用一个3×3大小的卷积核对一张5×5大小的图像进行卷积操作,当计算图中红色方块对应的像素的卷积结果时,我们首先把卷积核的中心放置在该像素位置,翻转核之后再依次计算核中每个元素和其覆盖的图像像素值的乘积并求和,得到新的像素值三种常见
2020-09-10 16:09:15
718
原创 Unity--高级纹理
反射天空盒创建用于映射的立方体纹理texCUBE折射斯涅尔定律 Snell’s Law>refract(viewdir, normal, refractRatio) params: 入射光线方向、法线方向、入射光线所在介质折射率和折射光线所在介质的折射率比值菲涅尔反射...
2020-09-10 16:07:27
173
原创 Unity--复杂光照渲染/渲染路径
前向渲染路径使用深度缓冲区判断一个片元是否可见,如果可见,就更新颜色缓冲区中的颜色值。Unity中的前向渲染:Base Pass + Additional Pass。Base Pass只调用一次,Additional Pass根据影响该物体的光源数调用多次。顶点照明渲染路径前向渲染路径的子集。所有可以在顶点照明中实现的,前向渲染都可以实现。延迟渲染路径使用G-buffer存储我们所关心的表面信息。两个Pass组成,一个Pass如果深度缓冲区可见,则在G-buffer中存储表面信息。在另一个Pa
2020-09-10 16:06:29
267
原创 Unity--透明纹理效果
透明度测试clip 舍弃透明度不满足阈值的片元透明度混合使用当前片元的透明度作为混合因子,与颜色缓冲种的颜色值进行混合。透明度混合需要【关闭深度写入】,要十分小心渲染顺序。使用Blend命令。Blend指令说明Blend Off关闭混合(默认)Blend SrcFactor DstFactor片元产生的颜色乘以SrcFactor,加上屏幕上已有的颜色乘以DstFactor,得到最终的颜色(写入颜色缓存)Blend SrcFactor DstFactor,
2020-09-10 16:05:02
508
原创 Unity--内置转换矩阵
内置转换矩阵名称说明UNITY_MATRIX_MVP当前模型视图投影矩阵,通常用于把顶点/方向矢量从模型空间转换到裁剪空间UNITY_MATRIX_MV当前模型视图矩阵,通常用于把顶点/方向矢量从模型空间转换到视角(相机)空间UNITY_MATRIX_V当前视图矩阵,通常用于把顶点/方向矢量从世界空间转换到视角(相机)空间UNITY_MATRIX_P当前的投影矩阵,通常用于把顶点/方向矢量从视角(相机)空间转换到裁剪空间UNITY_MATRIX_VP当
2020-09-10 16:03:54
2201
原创 OpenGL--一些基础概念复习
OpenGL: 一个定义了函数布局和输出的图形API的正式规范。GLEW: 一个拓展加载库,用来为我们加载并设定所有OpenGL函数指针从而让我们能够使用所有(现代)OpenGL函数。视口(Viewport): 我们需要渲染的窗口。图形管线(Graphics Pipeline): 一个顶点在呈现为像素之前通过的过程。着色器(Shader): 一个运行在显卡上的小型程序。很多阶段的图形管道都可以使用自定义的着色器来代替原来的功能。标准化设备坐标(Normalized Device Coordinat
2020-09-10 16:01:25
199
原创 OpenGL--GLSL函数
in 只读允许函数重载:两个同名函数可以定义不同的参数或返回值可传递数组或结构体,不过GLSL是按值传递的,赋值操作可能会很多自函数subroutine (4.0以后才支持)自函数的使用过程:1.shader中定义subroutine的参数和返回类型 subroutine vec3shadeModelType( vec4 position, vec3 normal); subroutine uniformshadeModelType shadeModel;2.定义自函数,先声明函数
2020-09-10 15:59:37
827
原创 OpenGL--抗锯齿
Multidampling多重采样技术:光栅化阶段,不再使用单一的采样点来决定三角形的范围,而使用多个。采样点越多精度越高。颜色值的多重采样深度测试和模板测试多重采样OpenGL中的MSAA多样本缓冲 Multisample BufferglfwWindowHint(GLFW_SAMPLES, 4);glEnable(GL_MULTISAMPLE);多采样纹理附件glTexImage2DMultisampleGL_TEXTURE_2D_MULTISAMPLE多采样渲染缓冲对象gl
2020-09-10 15:57:25
187
原创 OpenGL--实例化
实例化调用一次渲染函数绘制很多物体的技术。减少从CPU到GPU的通信时间。实例化渲染函数:glDrawArraysInstanced、glDrawElementsInstanced新的内建变量:gl_InstanceID,渲染每个实例的索引值实例化数组glVertexAttribDivisor。这个函数告诉OpenGL什么时候去更新顶点属性的内容到下个元素。它的第一个参数是提到的顶点属性,第二个参数是属性除数(attribute divisor)。默认属性除数是0,告诉OpenGL在顶点着色器的每
2020-09-10 15:56:07
234
原创 OpenGL--GLSL
Built-in Variable内建变量https://www.khronos.org/opengl/wiki/Built-in_Variable_(GLSL)顶点着色器变量gl_Position【输出】定点着色器输出的位置向量。gl_PointSize【输出】以像素的方式设置点的高度和宽度。它在着色器中描述每个顶点做为点被绘制出来的大小。gl_VertexID【读取】储存着我们绘制的当前顶点的ID。片段着色器gl_FragCoord【输入】【只读】当前frag的窗
2020-09-10 15:54:19
169
原创 OpenGL--高级数据
填充缓冲glBufferSubData(GL_ARRAY_BUFFER, 24, sizeof(data), &data); // 范围: [24, 24 + sizeof(data)]通过offset和size填充一段数据缓冲,而不是全部glMapBuffer绑定一个指针到数据缓冲,然后直接对数据操作。glUnmapBuffer解绑指针复制缓冲void glCopyBufferSubData(GLenum readtarget, GLenum writetarget, GLintp
2020-09-09 16:53:19
134
原创 OpenGL--环境贴图
CubeMap立方体贴图:将多个纹理组合起来映射到一个单一纹理。这样做可以使用方向向量索引和采样。Skybox6张图组成一个cubemap采样:立方体中心位于坐标系原点,天空盒上的每个位置向量就是立方体这个位置对应的纹理值。深度测试:把skybox输入位置的z用w替换,使其深度永远为1,然后在绘制时改变深度测试方程GL_LEQUAL,这样深度为1的天空盒也可以通过测试。Environment mapping环境映射反射(Reflect): 根据观察方向和法线向量,计算出反射向量,使用这个反
2020-09-09 16:52:12
504
原创 OpenGL--帧缓冲
帧缓冲:颜色缓冲 + 深度缓冲 + 模板缓冲Renderbuffer objects渲染缓冲对象:以OpenGL原生渲染格式存储数据。渲染缓冲对象通常是只写的,不能修改。glfwSwapBuffers使用渲染缓冲对象实现由于渲染缓冲对象通常是只写的,它们经常作为深度和模板附件来使用,由于大多数时候,我们不需要从深度和模板缓冲中读取数据,但仍关心深度和模板测试。我们就需要有深度和模板值提供给测试,但不需要对这些值进行采样(sample),所以深度缓冲对象是完全符合的。在帧缓冲项目中,渲染缓冲对象可
2020-09-09 16:50:59
170
原创 OpenGL--面剔除
顶点连接顺序实际的顶点连接顺序是在光栅化阶段计算的,默认情况下,逆时针的顶点连接顺序被定义为三角形的正面。面剔除开启:glEnable(GL_CULL_FACE);设置:glCullFace(GL_BACK);glCullFace函数有三个可用的选项:GL_BACK:只剔除背面。GL_FRONT:只剔除正面。GL_FRONT_AND_BACK:剔除背面和正面。...
2020-09-09 16:48:44
224
原创 OpenGL--模板检测使用
Stencil Buffer模板缓冲模板缓冲先清空模板缓冲设置所有片段的模板值为0,然后开启矩形片段用1填充。场景中的模板值为1的那些片段才会被渲染(其他的都被丢弃)。模板函数void glStencilFunc(GLenum func, GLint ref, GLuint mask)函数有三个参数:func:设置模板测试操作。这个测试操作应用到已经储存的模板值和glStencilFunc的ref值上,可用的选项是:GL_NEVER、GL_LEQUAL、GL_GREATER、GL_GEQUAL、G
2020-09-09 16:45:32
308
原创 OpenGL--深度测试简介
Depth Buffer深度缓冲由窗口系统自动创建,并将其深度值存储为16、24、32位的浮点数深度测试函数深度值精确度far和near是可见视图截锥的远近值,z是物体深度深度缓冲区的值并不是线性的屏幕空间(在视图空间投影矩阵应用之前是线性)。深度冲突两个平面或三角形如此紧密相互平行深度缓冲区不具有足够的精度以至于无法得到哪一个靠前。结果是,这两个形状不断似乎切换顺序导致怪异出问题。这被称为深度冲突(Z-fighting),因为它看上去像形状争夺顶靠前的位置。...
2020-09-09 16:40:01
189
原创 Unity--矩阵
###概念行矩阵、列矩阵方块矩阵 n*n单位矩阵:逆矩阵:。可逆:行列式不为0逆矩阵的性质:转置矩阵的逆矩阵是逆矩阵的转置;正交矩阵:正交矩阵的性质:正交矩阵的每一行(列)都是单位矢量正交矩阵的每一行(列)互相垂直...
2020-09-09 15:04:51
330
原创 Unity--GPUl流水线
Vertext Shader的主要任务有:坐标变换和逐顶点光照三角形遍历:检查每个像素是否被三角网格覆盖,如果被覆盖,生成一个fragment。Fragment Shader的输入是通过上阶段信息的插值得到。OpenGL 和 DirectX的区别Vertext Shader的主要任务有:坐标变换和逐顶点光照三角形遍历:检查每个像素是否被三角网格覆盖,如果被覆盖,生成一个fragment。Fragment Shader的输入是通过上阶段信息的插值得到。OpenGL 和 DirectX的区.
2020-09-09 15:03:35
346
原创 OpenGL--三种光源原理
Directional Light当一个光源无限远时,被称为定向光。所有的光线有着同一个方向。Point LightAttenuation:衰减DistanceConstantLinearQuadratic71.00.71.8131.00.350.44201.00.220.20321.00.140.07501.00.090.032651.00.070.0171001.00.0450.0075
2020-09-09 15:00:13
374
原创 OpenGL--一些基础概念复习
OpenGL: 一个定义了函数布局和输出的图形API的正式规范。GLEW: 一个拓展加载库,用来为我们加载并设定所有OpenGL函数指针从而让我们能够使用所有(现代)OpenGL函数。视口(Viewport): 我们需要渲染的窗口。图形管线(Graphics Pipeline): 一个顶点在呈现为像素之前通过的过程。着色器(Shader): 一个运行在显卡上的小型程序。很多阶段的图形管道都可以使用自定义的着色器来代替原来的功能。标准化设备坐标(Normalized Device Coordina.
2020-07-17 14:08:13
146
原创 OpenGL--相机.md
坐标空间的建立摄像机位置: cameraPos摄像机方向(z轴): cameraDirection = cameraPos - cameraTarget(0, 0, 0)右轴(x轴) : cameraRight定义一个上向量up = (0, 1, 0)cameraRight = cross(up, cameraDirection)上轴:cameraUp = cross(cameraDirection, cameraRight)Look At矩阵欧拉角俯仰角Pitch,绕x轴旋转偏
2020-07-17 14:00:44
175
原创 OpenGL--坐标系转换.md
坐标系局部空间(Local Space,或者称为物体空间(Object Space))世界空间(World Space)观察空间(View Space,或者称为视觉空间(Eye Space))裁剪空间(Clip Space)屏幕空间(Screen Space)坐标系转换模型矩阵视图矩阵投影矩阵...
2020-07-17 13:58:46
173
原创 OpenGL--向量计算和矩阵转换
点乘v¯⋅k¯=||v¯||⋅||k¯||⋅cosθ使用点乘可以很容易测试两个向量是否正交(Orthogonal)或平行(正交意味着两个向量互为直角)。点乘是通过将对应分量逐个相乘,然后再把所得积相加来计算的。叉乘叉乘只在3D空间中有定义,它需要两个不平行向量作为输入,生成一个正交于两个输入向量的第三个向量。矩阵相乘只有当左侧矩阵的列数与右侧矩阵的行数相等,两个矩阵才能相乘。矩阵相乘不遵守交换律(Commutative),也就是说A⋅B≠B⋅AA⋅B≠B⋅A。单位矩阵除对角线以外都
2020-07-17 13:56:30
517
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人