
Unity Shader
文章平均质量分 50
zengjunjie59
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Unity光照探头总结
作用:PBR流程中,光照探头用于给动态物体提供间接光的漫反射信息。整个流程:1:在烘培的时候,光照探头需要记录周围360度的颜色信息。类似反射探头的cubemap,但是由于光照探头非常多,而且cubemap占用内存太多,所以实际储存不可能用cubemap,而是储存着球谐函数某几个基函数的系数。当实际渲染进行采样的时候,用这几个系数和球谐函数基函数来还原周围的颜色信息。这里的思想和傅里叶变换是一样的,也是用几个简单的信息基函数,通过不同的系数来还原一个复杂的信号, 如下图。c1是第一个基函原创 2022-04-01 17:47:41 · 5486 阅读 · 0 评论 -
URP下SRPBatcher,GPUInstancing,动态合批,静态合批
SRPBatcher:适用前提:需要是同一个shader,可以是不同的材质球,Shader代码必须兼容SRP Batcher。但是不支持用材质球属性块(MaterialPropertyBlock) 渲染的物体必须是一个mesh或者skinnedmesh。不能是粒子。效果: 可以有效降低SetPassCall的数目,数据CPU性能优化优化原理:1.在过去的渲染架构中,Unity采取对一个材质分配一个C...............原创 2022-01-26 16:35:50 · 12859 阅读 · 4 评论 -
Command Buffers In Unity
Command Buffers In Unity1、参考文档:1、Unity官方文档:https://docs.unity3d.com/Manual/GraphicsCommandBuffers.html2、Unity官方API:https://docs.unity3d.com/ScriptReference/Rendering.CommandBuffer.html3、优快云 博客:http://blog.youkuaiyun.com/puppet_master/article/details/726699772转载 2021-05-20 20:08:18 · 1445 阅读 · 2 评论 -
内置管线Shader升级到URP详细手册
https://www.jianshu.com/p/3fef69e2efb6转载 2021-04-26 00:05:00 · 3336 阅读 · 0 评论 -
unity ddx/ddy
转自:https://unity.cn/projects/unity-hdrp-custom-pass-post-processing-hou-chu-li-te-xiao-xue-xi-er-zong-jieddx/ddyddx返回指定值相对于屏幕空间x坐标的偏导数。ddy返回指定值相对于屏幕空间y座标的偏导数。计算方法在三角形光栅化过程中,GPU一次运行许多片段着色器的实例,将它们组织成2×2像素的块。dFdx是将块中像素值的差值减去块左侧的像素值和右侧的像素值,dFdy是将转载 2021-03-12 17:07:27 · 2010 阅读 · 1 评论 -
UnityApplyDitherCrossFade(float2 vpos) -- 淡入淡出操作
作用:淡入淡出操作, 根据淡出程度unity_LODFade和屏幕坐标来对抖动贴图进行采样,并裁剪掉的透明度低于0.5的片元,从而实现半透明源码:unity_LODFade :https://blog.youkuaiyun.com/zengjunjie59/article/details/114295455unity_LODFade.y一共有十六个取值:0/16, 1/16 .... 15/16 的值frac函数的作用:取一个数字的小数部分,例如frac(1.23) = 0.23_Dith.原创 2021-03-02 22:27:28 · 1939 阅读 · 0 评论 -
unity_LODFade -- 淡化程度
unity_LODFade向量,可以传达淡化对象的程度。它的X分量包含渐变因子[0, 1]。它的Y分量包含相同的因子,但量化为16步,范围也是[0, 0.9375],十六个取值分别是: 0/16, 1/16, 2/16 .... 15/16原创 2021-03-02 21:48:28 · 1611 阅读 · 0 评论 -
Unity Meta Pass里面用到的UnityMetaVertexPosition函数
作用:根据顶点的光照贴图纹理映射坐标,求得顶点在模型空间中的x、y值,然后变换到裁剪空间中并返回源码:float4 UnityMetaVertexPosition( float4 vertex, float2 uv1, float2 uv2, float4 lightmapST, float4 dynlightmapST){ // 判断是否烘焙静态光照贴图 if (unity_MetaVertexControl.x) {原创 2021-02-23 17:13:59 · 1778 阅读 · 2 评论 -
unity shader里的_LightShadowData
_LightShadowData.x = 1.0 - shadow_strength //shadow_strength就是灯光组件里面的阴影强度,Strength(0~1)_LightShadowData.y = max(camera_far_clip / shadow_distance, 1.0) // 但未在当前内置着色器代码库中使用_...原创 2021-02-22 11:41:02 · 1666 阅读 · 0 评论 -
如何理解Unity中的MixedLighting
转载自:https://actrpg.wordpress.com/2020/09/28/%E5%A6%82%E4%BD%95%E7%90%86%E8%A7%A3unity%E4%B8%AD%E7%9A%84mixedlighting/Unity中一共有三种MixedLight模式:Baked Indirect,Shadow Mask, Subtractive。另外在Shadow Mask模式之下,还有一个Distance Shadow Mask的子模式。这些模式有什么差异呢?官方给出的对比可以归结到一张转载 2021-02-20 15:07:57 · 2522 阅读 · 1 评论 -
SHADOWS_SHADOWMASK与LIGHTMAP_SHADOW_MIXING
SHADOWS_SHADOWMASK对应设置:Window -> Lighting Settings -> Mixed Lighting -> Lighting Mode -> Shadowmask ,要勾选了上面的Baked Global Illumination才会有这个选项。该宏在混合光照的时候以及选中的上述选项之后才会为真LIGHTMAP_SHADOW_MIXING对应设置:Project Settings -> Quality -> Shad..原创 2021-02-19 17:24:08 · 2109 阅读 · 0 评论 -
UnityGetRawBakedOcclusions -- 对阴影遮罩(即静态阴影贴图)采样,一般在延迟渲染中用到
作用:对阴影遮罩采样,返回一个fixed4,四个分量对应前四个灯光的阴影遮罩值作用与UnitySampleBakedOcclusion类似,区别是这个方法返回一个四分量的阴影遮罩值,而UnitySampleBakedOcclusion只返回当前灯光的遮罩值UnitySampleBakedOcclusion解析:https://blog.youkuaiyun.com/zengjunjie59/article/details/113865055源码:fixed4 UnityGetRawBakedOcc原创 2021-02-19 16:30:20 · 602 阅读 · 0 评论 -
UnitySampleBakedOcclusion -- 对阴影遮罩(即静态阴影贴图)采样
作用:阴影蒙版取样,阴影蒙版可以在Window - Rendering - Lighting - Mixed Lightinig - Lighting Mode - Shadowmask启用源码:// 对阴影蒙版取样// 需要光照贴图的UV坐标和世界位置作为输入参数fixed UnitySampleBakedOcclusion (float2 lightmapUV, float3 worldPos){ // 判断是否启用了阴影遮罩 #if defined (SHADOWS原创 2021-02-19 15:47:59 · 732 阅读 · 0 评论 -
unity的纹理与采样器,各种宏的用法:UNITY_DECLARE_TEX2D,UNITY_DECLARE_TEX2D_NOSAMPLER,UNITY_SAMPLE_TEX2D_SAMPLER
有时在Shader编写过程中,我们可能会用到非常多纹理,如果每个纹理都采用类似uniform sampler2D _Mask;的方式进行声明,编辑器在编译shader的时候就会报错:Shader error in 'CloudShaow/MaskBlend': maximum ps_4_0 sampler register index (16) exceeded at line 69 (on d3d11)报错显示sampler采样器的数量超过了限制数量。这时可以把成对耦合的纹理和采样器分离...原创 2021-02-19 15:10:13 · 2951 阅读 · 2 评论 -
unity_OcclusionMaskSelector - 用于根据当前灯光index选择阴影遮罩贴图对应的通道
作用:根据当前灯光index选择阴影遮罩贴图对应的通道原理:unity_OcclusionMaskSelector是一个四维向量,四个维度分别对应阴影遮罩贴图里面的四个通道,第一个分量就是第一个灯光,总共支持四个灯光。用法:// 延迟渲染中的小例子float GetShadowMaskAttenuation(float2 uv){ float attenuation = 1; // 检查是否启用阴影遮罩 #if defined(SHADOWS_SHADOWMA原创 2021-02-19 12:04:40 · 444 阅读 · 0 评论 -
UnityMixRealtimeAndBakedShadows,合并阴影距离衰减与阴影遮罩到光线衰减中
作用:把阴影衰减与阴影遮罩叠加到光线衰减中阴影衰减是什么?实时阴影衰减距离对应设置Edit - Project Setting - Quality - Shadows - Shadow Distance。当片元与摄像机距离超过这个设置的距离的时候,阴影会衰减到看不见。在距离边缘会出现阴影渐变。这个渐变的值就是阴影衰减。范围从0~1,0表示不衰减,1表示阴影全衰减(即没有阴影)阴影遮罩是什么?灯管开启混合光照的时候才有用, 对应设置Window - Rendering - Lighting原创 2021-02-17 15:57:16 · 621 阅读 · 0 评论 -
SHADOWS_SHADOWMASK -- 阴影蒙版关键字
SHADOWS_SHADOWMASK是否烘焙阴影蒙版贴图,对应Light->Mixed Lighting->Lighting Mode->Shadowmask选项,勾选选项后对光照进行烘焙之后会烘焙出阴影遮罩。原创 2021-02-13 21:48:24 · 714 阅读 · 0 评论 -
UNITY_INITIALIZE_OUTPUT宏
UNITY_INITIALIZE_OUTPUT(type, name) –此宏用于把所给结构体里的各个变量初始化为0。在使用旧版标准所写的Shader时,经常会报错“Try adding UNITY_INITIALIZE_OUTPUT(Input,o); like this in your vertfunction.”之类的错误,加上这句就不会报错了。源码:#if defined(UNITY_COMPILER_HLSL) || defined(SHADER_API_PSSL) || defin原创 2021-02-11 15:13:49 · 1996 阅读 · 0 评论 -
DecodeDirectionalLightmap -- 解码光照方向贴图
作用:根据光照方向贴图中采样到的光照方向,用半兰伯特光照模型进行光照计算。半兰伯特:https://www.jianshu.com/p/646986399395源码:inline half3 DecodeDirectionalLightmap (half3 color, fixed4 dirTex, half3 normalWorld){ // In directional (non-specular) mode Enlighten bakes dominant light di原创 2021-02-04 20:45:56 · 1415 阅读 · 0 评论 -
unity烘焙静态光照贴图里的UnityMetaFragment方法
作用:决定片元着色器要返回的是主纹理还是自发光颜色,以及如何编码输出结果。源码和解析:half4 UnityMetaFragment (UnityMetaInput IN){ half4 res = 0;#if !defined(EDITOR_VISUALIZATION) // x分量代表的是:烘焙表面漫反射对其他物体的影响,也就是让物体表面漫反射的颜色,参与gi。 if (unity_MetaFragmentControl.x) { res原创 2021-02-03 12:00:17 · 884 阅读 · 0 评论 -
unity_WorldToShadow矩阵
作用:把世界坐标转换到阴影空间中。例如:unityShadowCoord4 shadowCoord = mul(unity_WorldToShadow[0], unityShadowCoord4(worldPos, 1));// 其中unityShadowCoord4 就是 float4// 通过透视除法可以得到阴影贴图的uv:float3 uv = shadowCoord.xyz / shadowCoord.w// 如果是平行光,则相当于正交投影,不需要透视除法...原创 2021-01-30 11:38:58 · 924 阅读 · 0 评论 -
延迟渲染里为什么i.ray = lerp(UnityObjectToViewPos(v.vertex)) * float(-1, -1, 1)里要乘 float3(-1, -1, 1)
下面是built-in着色器的源码:为什么i.ray = lerp(UnityObjectToViewPos(v.vertex)) * float(-1, -1, 1)里要乘 float3(-1, -1, 1)?请看代码下面的注释#pragma vertex vert_deferred#pragma fragment fragstruct unity_v2f_deferred { float4 pos : SV_POSITION; float4 uv : TEXCOOR.原创 2021-01-23 12:01:32 · 966 阅读 · 0 评论 -
unity shader 里的unity_CameraToWorld矩阵
作用:把坐标从视口坐标空间转换到世界空间,但是要注意,这里的坐标不是真的视口坐标,而是z值反转的视口坐标,相当于左手坐标系里的视口坐标(正常视口坐标是右手坐标系)详细解析:https://blog.youkuaiyun.com/qq_35817700/article/details/94863234?ops_request_misc=&request_id=&biz_id=102&utm_term=unity_CameraToWorld&utm_medium=distribute原创 2021-01-23 11:14:35 · 1858 阅读 · 0 评论 -
tex2Dbias--偏移mipmap级别后对贴图进行采样
作用:在偏移mipmap级别后对贴图进行采样用法:float3 color = tex2Dbias(_LightTexture0, float4(uv, 0, -8)); // 这里的-8就是偏移量文档:https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-tex2dbias...原创 2021-01-22 11:07:05 · 1547 阅读 · 0 评论 -
阴影渐变衰减UnityComputeShadowFadeDistance与UnityComputeShadowFade
这两个方法用于计算阴影渐变衰减1,UnityComputeShadowFadeDistance:源码:float UnityComputeShadowFadeDistance(float3 wpos, float z){ float sphereDist = distance(wpos, unity_ShadowFadeCenterAndType.xyz); return lerp(z, sphereDist, unity_ShadowFadeCenterAndType.w)原创 2021-01-21 17:05:00 · 1196 阅读 · 0 评论 -
UNITY_Z_0_FAR_FROM_CLIPSPACE--把裁剪空间下的z值转换到[0, 1]
官方文档:https://docs.unity3d.com/560/Documentation/Manual/SL-PlatformDifferences.html作用:把不同平台下的裁剪空间下的z值映射到[0, 1]的范围用法:float clipSpaceRange01 = UNITY_Z_0_FAR_FROM_CLIPSPACE(rawClipSpace);源码:#if defined(UNITY_REVERSED_Z) #if UNITY_REVERSED_Z ==原创 2021-01-12 14:52:26 · 1440 阅读 · 0 评论 -
unity3d 的 UNITY_CALC_FOG_FACTOR_RAW 宏 -- 雾效果计算
作用:根据片元到摄像机的距离得到雾的浓度用法:定义关键字,#pragma multi_compile_fog相当于#pragma multi_compile FOG_LINEAR FOG_EXP FOG_EXP2 ,三个分别对于对应Lighting Window - Other Setting - Fog - Mode里面的三个选项(线性、指数、指数平方)。// 得到和雾效混合后的颜色float4 ApplyFog(float4 color, Interpolators i)原创 2021-01-08 10:33:26 · 484 阅读 · 1 评论 -
BoxProjectedCubemapDirection--镜面反射中的盒型投影函数
作用:返回一个用于提取反射探头环境贴图CubeMap的向量。源码:inline float3 BoxProjectedCubemapDirection (float3 worldRefl, float3 worldPos, float4 cubemapCenter, float4 boxMin, float4 boxMax){ // unity内置宏,解析:https://blog.youkuaiyun.com/zengjunjie59/article/details/111866881原创 2020-12-29 11:40:49 · 1288 阅读 · 0 评论 -
如何在shader中避免使用if else
https://www.bilibili.com/read/cv1469216/转载 2020-12-28 15:50:59 · 1490 阅读 · 0 评论 -
unity的UNITY_BRANCH和UNITY_FLATTEN宏
MSDN文档解析:https://docs.microsoft.com/zh-cn/windows/win32/direct3dhlsl/dx-graphics-hlsl-ifUNITY_BRANCH:GPU会先执行if表达式里的条件,若条件返回true,则后续仅执行true对应的那一段代码。但会打乱执行顺序,不适合并行处理。UNITY_FLATTEN:GPU会执行所有分支的代码,在后面才通过if表达式里的条件来选取其中一个分支的结果。更适合于并行处理。如果什么都不标记的话编译器会按自己的.原创 2020-12-28 15:11:16 · 2558 阅读 · 0 评论 -
Unity_GlossyEnvironment--包含所有用于转换粗糙度,对立方体贴图采样以及从HDR转换的代码。
UnityStandardBRDF包含文件包含Unity_GlossyEnvironment函数。它包含所有用于转换粗糙度,对立方体贴图采样以及从HDR转换的代码。采样环境贴图得到间接光的环境反射的例子(镜面反射):UnityIndirect CreateIndirectLight(Interpolators i, float3 viewDir){ UnityIndirect indirectLight; indirectLight.diffuse = 0; indire原创 2020-12-24 17:27:30 · 1930 阅读 · 0 评论 -
Unity投射阴影--V2F_SHADOW_CASTER,TRANSFER_SHADOW_CASTER_NORMALOFFSET(o),SHADOW_CASTER_FRAGMENT(i)三部分
作用:让物体能够投射阴影原理:返回裁剪空间的坐标,写入depth buff,让摄像机在光源空间渲染出深度图,再进一步渲染出屏幕阴影纹理,最后在光照pass里面对纹理进行采样。例子:Pass {Tags { "LightMode" = "ShadowCaster"}CGPROGRAM #pragma target 3.0 #pragma multi_compile_shadowcaster #include "CustomS原创 2020-12-22 17:14:56 · 2534 阅读 · 0 评论 -
U3D EncodeFloatRGBA&DecodeFloatRGBA
转自:http://blog.sina.com.cn/s/blog_70f96aa90102v0t7.htmlU3D EncodeFloatRGBA&DecodeFloatRGBAUnityCG.cginc中的原函数代码如下:inline float4 EncodeFloatRGBA( float v ){ float4 kEncodeMul = float4(1.0, 255.0, 65025.0, 160581375.0); float kEncodeBit = 1.0/255.0;转载 2020-12-19 15:49:24 · 1350 阅读 · 1 评论 -
UnityShader变种管理小技巧
转自:https://zhuanlan.zhihu.com/p/93800429UnityShader 变种的控制Unity Shader 有时候变种用多了 会出现到了游戏里面Shader文件内存太大,爆炸的情况。有时候我们的 #pragma shader_feature 或者 #pragma multi_compile命令手动添加上去,这个比较直观看出来。还有一种情况是,我们使用内建的快捷宏引入的比如#pragma multi_compile_fwdbase#pragma multi_comp转载 2020-12-19 14:51:48 · 773 阅读 · 1 评论 -
Unity接收阴影--SHADOW_COORDS, TRANSFER_SHADOW, SHADOW_ATTENUATION---计算阴影的三个主要部分
关于阴影深度的基础知识:传统的ShadowMapShadowMap说起来十分简单,把摄像机和光源的位置重叠,那么场景中该光源的阴影区域就是那些摄像机看不到的地方,主要应用在前向渲染路径中。具体实现分以下几个步骤:如果有平行光开启了阴影,Unity就会为该光源计算它的ShadowMap(只会计算一个平行光),这张ShadowMap其实就是深度图,记录了从该光源的位置出发、能看到的场景中距离它最近的表面位置(深度信息)。 Unity中实现了一个额外的Pass来专门更新光源的ShadowMap,原创 2020-12-18 17:23:15 · 9293 阅读 · 0 评论 -
unity shader视口空间到屏幕空间各坐标的取值范围
模型空间->世界空间->视口空间:比较容易理解,就是用矩阵进行缩放旋转和平移视口空间(右手坐标系)->齐次裁剪空间(左手坐标系):下文中的n代表near,f代表far,fov代表FOV,a代表Aspect ratio设视口空间坐标点为vp = {vx, vy, vz},裁剪空间坐标点为cp = {cx, cy, cz, cw}cp = {cx, cy, cz, cw} = {-vx * n, -vy * n, -a*vz + b, -vz}...原创 2020-12-17 19:32:56 · 2669 阅读 · 1 评论 -
ComputeScreenPos,裁剪空间齐次坐标转换到屏幕空间的齐次坐标
作用:把裁剪空间齐次坐标转换到屏幕空间的齐次坐标原理:裁剪空间下的齐次坐标,x和y的取值范围是[-w, w], w=-z。而屏幕空间下的齐次坐标取值范围是[0, w], w=-z。所以核心代码就是 float2 screenPos = (clipPos.xy + clipPos.w) / 2;最后通过透视除法之后xy的取值范围就是[0, 1]了。一般用来提取屏幕纹理源码:其中在DirectX下屏幕坐标的原点在左上角,所以需要翻转Y坐标,此时_ProjectParams.x变量原创 2020-12-13 21:09:21 · 2671 阅读 · 0 评论 -
UnityClipSpaceShadowCasterPos--投射阴影时的顶点法向偏差
作用:把顶点坐标从模型空间转换到裁剪空间,并且应用法向偏差,即Normal Bias,用于解决shadow acne(阴影失真)的问题。原理:它将位置转换为世界空间,顶点坐标应用法线偏差(顶点坐标往法线方向偏移),然后转换为剪辑空间。确切的偏移量取决于法线和光照方向之间的角度以及阴影纹理像素大小(slope scale based depth bias)。偏移之后片元到摄像机的距离就会变近,当与片元到光源的距离比较的时候,更容易判断到是照亮状态。如下图:若光源到片元ad的距离是9.8,光源.原创 2020-12-11 18:28:29 · 726 阅读 · 0 评论 -
UnityApplyLinearShadowBias -- Unity中计算阴影bias的方法
作用:偏移片元在光源空间下的裁剪坐标,用于解决shadow acne(阴影失真)的问题。原理:通过减少光源到物体的深度图的数值(距离越远数值越小),从而使光源到物体表面片元的距离数值增加,在比较物体片元到摄像机的距离和到光源的距离时,到光源的距离比真实数值更远一点,通过距离比较之后,把处于边界值的片元都当作被光源照射到。如下图,如果不启用bias,ad片元能被照射到,而bc片元则不能被照射到。详细说明:https://blog.youkuaiyun.com/lawest/article/de...原创 2020-12-11 16:43:26 · 2039 阅读 · 0 评论 -
阴影
原文:https://www.bilibili.com/read/cv6361634转载 2020-12-03 21:23:18 · 124 阅读 · 0 评论