Unity3D

一篇文章说透计算着色器的SV_DispatchThreadID

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com SV_DispatchThreadID 是HLSL(High-Level Shading Language)中的一个语义(Semantic),用于在Compute Shader中获取当前线程的全局线程ID。它是Compute Shader中非常重要的一个概念,用于确定每个线程处理的数据或任务。 SV_DispatchThreadID 的含义 全局线程ID: SV_DispatchThreadID 是一个 uint3 类型的变量,表示当前线程在全局线程空间中的ID。 它的三个分量(x、y、z)分别表示线程在X、Y、Z三个维度上的全局索引。 线程的全局位置: SV_DispatchThreadID 的值范围由程序语言层(例如C#) 的Dispatch 调用,和HLSL语言中的 numthreads 语句定义。 例如,如果调度了 Dispatch(10, 20, 30),并且 numthreads 是 [8, 8, 1],那么: SV_DispatchThreadID.x 的范围是 [0, 10*8-1](即 [0, 79])。 SV_DispatchThreadID.y 的范围是 [0, 20*8-1](即 [0, 159])。 SV_DispatchThreadID.z 的范围是 [0, 30*1-1](即 [0, 29])。 用途: SV_DispatchThreadID 通常用于确定当前线程处理的数据索引。 例如,在处理2D纹理时,SV_DispatchThreadID.xy 可以直接用作纹理坐标。 在处理1D数组时,SV_DispatchThreadID.x 可以直接用作数组索引。 SV_DispatchThreadID 的计算方式 SV_DispatchThreadID 的值是由以下两个因素决定的: 线程组的大小(由 numthreads 定义): 例如,[numthreads(8, 8, 1)] 表示每个线程组有 8x8x1 = 64 个线程。即是说,numthread语句,是声明“线程”的。 线程组的数量(由 Dispatch 调用定义):

使用mipmap streaming来优化GPU的纹理内存

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 本文所涉及到的API和Unity3D编辑器都是基于6000.0.25f1c1版本 1 mipmap streaming 简介 使用 mipmap 流来限制 GPU 内存中纹理的大小。 1.1 mipmap streaming的工作原理 对于每个被摄像机观察到的纹理,Unity会自动计算并加载其特定级别的mipmap,而不是加载所有级别。这意味着 Unity 只会将每个纹理的指定mipmap level的内容从磁盘传输到 CPU 和 GPU。 Unity 会以尽可能高的分辨率加载 mipmap level,但如果较高分辨率的 mipmap level不符合您设置的内存限制,则使用较低的 mipmap level。mipmap可预配置 Unity 在 GPU 上缓存指定mipmap level的纹理内容,以避免重复加载。 1.2 mipmap streaming的限制 Unity不支持对地形纹理使用mipmap streaming,因为 Unity 始终需要最高分辨率的 mipmap level。 Unity不支持对纹理数组、cubemap,3D纹理使用mipmap streaming。 如果使用Graphics.DrawMeshNow等 API来渲染纹理,Unity 将无法获得计算 mipmap level所需的信息。使用Texture2D.requestedMipmapLevel API 手动设置纹理的 mipmap level,或者禁用mipmap streaming。 如果纹理有tiling和offset属性,但又没指定使用_ST属性,Unity可能无法正确计算这种纹理的mipmap level。 2 启用 mipmap streaming 要启用 mipmap streaming,按照以下步骤操作: 点击【Edit|Project Settings】菜单项,弹出【Project Settings】面板,选中【Quality】项 在【Texture】部分中,启用【Mipmap Streaming】 在默认情况下,这时候为场景中的所有摄像机都打开了mipmap streaming。在编辑器中,mipmap streaming在edit mode或者play mode下都处于开启状态。

一段根据片元深度值重建对应的深度坐标值的代码及其解释

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com // 从深度信息重建世界空间坐标 // 参数: // screenPos - 屏幕空间坐标(通常来自顶点着色器的SV_Position) // viewDir - 视图空间方向向量 // sceneDepth - 包含原始深度和线性深度值的结构体 float3 ReconstructWorldPosition(float4 screenPos, float3 viewDir, SceneDepth sceneDepth) { // 平台深度缓冲处理 ---------------------------------------- #if UNITY_REVERSED_Z // 处理Reversed-Z平台(如DirectX) real rawDepth = sceneDepth.raw; // 直接使用原始深度值 #else // OpenGL等常规深度缓冲平台 // 将深度值从[0,1]映射到[Near,1],适配OpenGL的NDC范围 real rawDepth = lerp(UNITY_NEAR_CLIP_VALUE, 1, sceneDepth.raw); #endif // 正交投影处理 -------------------------------------------- #if defined(ORTHOGRAPHIC_SUPPORT) // 将屏幕坐标转换为NDC空间(-1到1范围) float4 viewPos = float4( (screenPos.xy / screenPos.w) * 2.0 - 1.0, // 透视除法后映射到NDC rawDepth, // 深度值 1.

一段计算场景深度与当前透明几何像素的线性深度差的代码及其解释

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com // 计算场景深度与当前透明几何像素的线性深度差 // 参数: // depth - 包含场景深度信息的结构体(包含原始深度和线性眼空间深度) // positionCS - 当前像素在裁剪空间中的位置坐标(SV_Position) float SurfaceDepth(SceneDepth depth, float4 positionCS) { // ===================== 场景深度计算 ===================== // 根据投影模式选择计算方式: // unity_OrthoParams.w: 0=透视投影 | 1=正交投影 const float sceneDepth = (unity_OrthoParams.w == 0) ? depth.eye // 透视模式:直接使用预计算的线性眼空间深度 : LinearDepthToEyeDepth(depth.raw); // 正交模式:将原始深度转换到眼空间 // ================= 当前像素深度计算 ==================== const float clipSpaceDepth = (unity_OrthoParams.w == 0) ? LinearEyeDepth(positionCS.z, _ZBufferParams) // 透视模式:裁剪空间z转线性眼深度 : LinearDepthToEyeDepth(positionCS.z / positionCS.w); // 正交模式:NDC z转眼空间深度 // ================ 深度差异计算结果 ===================== return sceneDepth - clipSpaceDepth; // 返回场景深度与当前像素深度的差值 } 首先,函数内部有两个const float变量,sceneDepth和clipSpaceDepth,然后返回它们的差值。我需要理解这两个变量是如何计算的,特别是条件判断部分unity_OrthoParams.

Unity3D的内置宏 DYNAMICLIGHTMAP_ON

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 在Unity中,DYNAMICLIGHTMAP_ON 是一个与 动态光照贴图(Dynamic Lightmaps) 相关的内置变体关键字(Shader Variant Keyword)。它的核心作用是 控制着色器是否处理动态光照贴图数据,主要用于实现动态物体的间接光照混合效果。 核心含义 动态光照贴图标识 当该宏被激活时(#if defined(DYNAMICLIGHTMAP_ON)),表示当前渲染的物体 启用了动态光照贴图,需要在着色器中采样动态光照贴图数据。 若未激活,则物体仅使用静态光照贴图或实时光照。 技术目的 允许动态物体(如可移动的物件)与烘焙的静态场景光照进行间接光交互。 结合 Enlighten 或 Progressive Lightmapper 系统,实现动态物体的间接光实时更新。 触发条件 该宏在以下情况下自动激活: 物体设置 物体的 Mesh Renderer 组件中勾选 Lightmap Static 为 Contribute GI,同时设置 Lightmap Parameters 为支持动态更新。 光照系统配置 项目中启用了 Realtime Global Illumination(实时全局光照)。 使用 Baked Indirect 或 Shadowmask 混合光照模式。 Shader编译指令 在Shader中通过 #pragma multi_compile 或 #pragma shader_feature 声明动态光照贴图支持: #pragma multi_compile __ DYNAMICLIGHTMAP_ON 技术实现机制 1. 数据传递 动态光照贴图信息通过以下方式传递到着色器: 顶点数据:动态光照贴图坐标通过 TEXCOORD2 传递。 Uniform变量:动态光照贴图纹理(unity_DynamicLightmap)和采样器(samplerunity_DynamicLightmap)。 2. 着色器代码示例 struct v2f { float2 uv : TEXCOORD0; #if defined(LIGHTMAP_ON) float2 lightmapUV : TEXCOORD1; // 静态光照贴图UV #endif #if defined(DYNAMICLIGHTMAP_ON) float2 dynamicLightmapUV : TEXCOORD2; // 动态光照贴图UV #endif }; half3 GetLightmapColor(v2f i) { half3 staticGI = 0; half3 dynamicGI = 0; #if defined(LIGHTMAP_ON) staticGI = SampleLightmap(unity_Lightmap, samplerunity_Lightmap, i.

Unity3D的内置宏 REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 在Unity URP中,REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR 是一个与阴影计算相关的内置宏(Shader Variant Keyword),它的作用是: 核心含义 控制顶点着色器是否需要生成并传递阴影坐标插值器 当该宏被激活时,Unity会在顶点着色器阶段计算主光源的阴影坐标,并通过顶点着色器输出结构体(Varyings)传递到片元着色器。这使得片元着色器可以直接使用插值后的阴影坐标进行阴影采样,避免在片元阶段重复计算。 触发条件 该宏会自动激活,当以下条件满足时: 项目中启用了 主光源阴影(Main Light Shadows) 使用了 逐顶点阴影坐标插值 的优化模式(而非逐片元计算) 在Shader中通过 #pragma multi_compile 启用了阴影相关功能(例如 _MAIN_LIGHT_SHADOWS) 典型应用场景 在URP的Shader中,你会在顶点着色器输出结构体 Varyings 中看到类似代码: struct Varyings { float4 positionCS : SV_POSITION; float3 positionWS : TEXCOORD0; // 当 REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR 激活时,自动添加阴影坐标字段 #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) float4 shadowCoord : TEXCOORD1; #endif }; 技术原理 阴影坐标生成 顶点着色器通过 GetShadowCoord(vertexInput) 计算阴影坐标,并存储在 shadowCoord 中。 插值优化 阴影坐标在顶点阶段计算后,通过插值器传递到片元着色器,减少片元阶段的计算量。 自动编译控制 Unity会根据项目设置和Shader特性,在编译时自动决定是否启用该宏,生成不同的Shader变体。 对比其他阴影模式 宏名称 计算阶段 性能消耗 精度 REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR 顶点着色器 较低 中等 REQUIRES_FRAGMENT_SHADOW_COORD_INTERPOLATOR 片元着色器 较高 较高 调试与手动控制 强制启用/禁用(不推荐)

Unity3D的内置宏 _LIGHT_LAYERS

Unity3D的内置宏 ADDITIONAL_LIGHTS_VERTEX 请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 在Unity URP/HDRP中,_LIGHT_LAYERS 是一个与 光源层级过滤(Light Layer Masking) 相关的内置变体关键字(Shader Variant Keyword)。它的核心作用是 实现基于层级的光源与物体交互控制,允许开发者通过层掩码(Layer Masks)精确控制哪些光源可以影响特定物体。 核心含义 1. 功能定位 光源筛选机制:激活该宏后,物体会根据自身的 Light Layer Mask 和光源的 Light Layer Mask 进行匹配,只有匹配层的光源才会对该物体产生光照影响。 渲染优化:通过层级过滤减少无效光源计算,提升复杂场景性能。 2. 技术目标 精细化光源控制:例如让装饰性灯光只影响场景道具,不影响角色 多世界渲染支持:用于分屏游戏或VR中不同视角的独立光照逻辑 触发条件 该宏的激活需要同时满足以下条件: 项目设置启用 URP/HDRP Asset 中开启光源层支持: URP: Lighting > Light Layers > Enable Light Layers HDRP: Lighting > Light Layers Shader声明 在着色器中通过#pragma指令声明支持: #pragma multi_compile _ _LIGHT_LAYERS 光源与物体配置 光源的 Light Layer Mask 设置为非"Everything"值 物体的 Renderer组件 > Rendering Layer Mask 设置为与光源匹配的层级 技术实现机制 1.

Unity3D的内置宏 _ADDITIONAL_LIGHTS_VERTEX

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 在Unity URP中,_ADDITIONAL_LIGHTS_VERTEX 是一个与 附加光源处理方式 相关的内置变体关键字(Shader Variant Keyword)。它的核心作用是 控制附加光源的光照计算阶段,决定是在 顶点着色器 还是 片元着色器 中处理附加光源的贡献。 核心含义 1. 光源计算阶段选择 启用时(_ADDITIONAL_LIGHTS_VERTEX 被定义): 附加光源的光照计算在 顶点着色器 阶段完成,计算结果通过顶点插值传递到片元着色器。 未启用时(默认或使用 _ADDITIONAL_LIGHTS): 附加光源的光照计算在 片元着色器 阶段逐像素完成。 2. 性能与质量的权衡 模式 性能消耗 光照精度 适用场景 _ADDITIONAL_LIGHTS_VERTEX 较低 中等(顶点插值) 移动端、低性能设备 _ADDITIONAL_LIGHTS 较高 高(逐像素) PC/主机、高质量渲染需求 触发条件 该宏的激活由以下因素决定: URP Asset设置 在URP资源中启用 Additional Lights(附加光源) 设置 Per Object Light 类型为 Vertex 或 Fragment(对应不同模式) Shader编译指令 在Shader中使用以下指令声明变体: #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS 实际光源数量 当场景中存在 附加光源(点光源、聚光灯等) 且影响当前渲染对象时,Unity自动选择对应变体。 技术实现原理 顶点着色器阶段处理(_ADDITIONAL_LIGHTS_VERTEX) // 顶点着色器中计算附加光源 Varyings vert(Attributes input) { Varyings output; // .

StylizedWater2插件帮助文档精读

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 插件官方文档地址 Stylized Water 2 入门指南 1. 准备工作 确保项目无控制台错误:未解决的代码错误会导致资源代码无法编译,材质可能显示为粉色。 项目设置: 使用 Universal Render Pipeline (URP):在 Edit -> Project Settings -> Graphics 中检查是否已分配 URP 资源。 如果没有正确设置 URP,材质将显示为粉色。请参考 Unity 的 URP 文档进行设置。 注意:建议在项目早期决定使用 URP,因为在生产过程中切换到 URP 可能导致其他自定义着色器失效。 颜色空间:推荐使用 Linear 颜色空间(新项目默认使用 Gamma 空间),详细信息请参考 Unity 文档。 2. URP 设置 启用必要选项: Depth Texture:用于多种效果(如深度和交互动画)。如果禁用,这些效果将失效,且在 Android 上构建时水可能会不可见。 Opaque Texture:用于折射效果,启用折射时需要。 如果这些选项未启用,但着色器使用了相关功能,材质 UI 中会显示警告并提供快速修复按钮。 相机设置:每个相机可以覆盖这些设置。如果某些效果在特定场景或相机中不可见,请检查这些选项是否被设置为“Off”。 质量级别设置:如果使用了不同质量级别的管道设置,请确保这些选项也已启用,否则在较低质量级别下运行时,水效果可能失效。 3. 向场景中添加水 建议:创建或复制材质(而不是直接使用包中的材质),以避免更新资源时设置被意外覆盖。 方法: 方法 1:将 Assets/StylizedWater2/Prefabs 中的预制件拖入场景,并调整材质属性。 方法 2:通过 GameObject -> 3D Object -> Water -> Object 菜单选项创建新的 Mesh Renderer。 方法 3: 在场景中创建一个平面网格。 创建新材质并分配 StylizedWater2/Default 着色器。 通过 Add Component -> Stylized Water 2 -> Water Object 添加 Water Object 组件(仅在需要使用平面反射时必要,但无负面影响)。 材质参数:每个参数都有工具提示,鼠标悬停可查看描述。 Stylized Water 2 着色器使用指南 1.

Amplify Imposter 插件使用指南

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 原文地址 描述 Amplify Impostors 是一款小巧但功能强大的工具,可用于创建不同类型的 Impostors,这些 Impostors 是平面和简单多边形构成的复杂高多边形对象的替代品(substitutes ),可渲染原始对象的虚假版本(fake version)(因此得名)。与传统精灵非常相似,它们通常由单个平面四边形或简单多边形组成,并且像经典广告牌(classic billboard)一样始终面向相机。将它们视为要渲染的面向相机的纸板版本。使用此类技术的常见目的是能够用非常低的多边形表示远处的物体,例如树木、灌木丛、岩石、废墟、建筑物、道具等。 有多种方法可以创建这些 impostor,每种方法都有各自的优点和缺点。此工具旨在提供最有用和最流行的技术,同时使创建过程尽可能简单。 安装 打开 AmplifyImpostors.unitypackage Unity 加载后会显示“导入包”窗口,选择全部并点击导入 警告 - 如果您在同一个项目中使用 Amplify Shader Editor请确保两个软件包都是最新的;检查您的控制台是否存在与之相关的任何错误 快速入门说明 选择场景中的游戏对象或项目中的预制件 在检查器窗口中搜索并添加“Amplify Impostor”组件 按“Bake Impostor”并选择要保存impostor文件的位置 当前功能 Impostor类型 目前支持三种预先烘焙的 Impostor 类型 (左边是真实网格,右边是冒名顶替网格) 效果图 示意图 描述 球面(spherical):以典型的经纬度格式拍摄多张照片。着色器更简单、更快速,近距离拍摄时, impostor看起来基本没问题,但帧间跳动相当明显。可以通过增加轴帧数(以牺牲分辨率为代价)来缓解这一问题。 八面 (Octahedron) :以十球面格式(icosphere format)拍摄多张照片。这样做是为了保证相邻帧数固定为 3,这样在相对于相机的任何给定位置,我们都可以混合最近的三帧。这样做的好处是消除帧之间的弹出。另一方面,着色器复杂度更高,当近距离观察时,混合变得太明显,出现明显的重影伪影。 半八面体(HemiOctahedron):半八面体变体与正八面体类似,不同之处在于只从物体的上半球拍摄相同数量的镜头,从而有效地使混合精度翻倍。但缺点是,由于不烘焙下半球,从下方看时会产生不正确的结果。这种方法通常仅在您知道物体将始终从上方观看时使用(即:自上而下的相机(top-down cameras))。 实时渲染 这些预烘焙解决方案中的每一个方案,都会渲染表面的构成部分贴图,以支持实时照明。这些方案支持: 可编写脚本的渲染管道(HD 和 LW)(v4.9.0+) 标准/旧版前向渲染和延迟渲染 动态灯光和阴影 对象交叉点(object intersection)的深度写入 全局照明 烘焙光照贴图(通过自定义烘焙) GPU 实例 抖动交叉淡入淡出 其他的 自定义打包贴图(package map):使用标准材质烘焙渲染最多 4 张贴图和自定义材质,使用自定义烘焙渲染最多 8 张不同的地图(支持 PNG 和未压缩的 TGA) 反照率 (RGB) | Alpha 蒙版 (A) 镜面反射 (RGB) | 平滑度 (A) 物体法线 (RGB) | 深度 (A) 发射 (RGB) | 环境光遮蔽 (A) 自定义形状编辑器(Custom Shape Editor):自动生成自定义形状,以移除替代器的大部分透明区域,从而减少过度绘制。还支持手动编辑。 烘焙预设(baking presets):定义烘焙替代者的预设,其中还包含各种导入和导出选项。 脚本化的渲染管道(scriptable render pipeline) 为了将 Amplify Impostors 与 SRP 一起使用,请务必导入所需的包 ( AmplifyImpostors\Plugins\EditorResources\RenderPipelinePackages )。