Posts

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.

Godot4.0的浮动游戏工作区自动全屏的问题

在 Godot 4.0 中,当屏幕分辨率小于项目设置中指定的窗口大小,Godot 会自动将主窗口强制切换为全屏模式,这是一种为防止窗口内容显示不完整而设计的行为,但这对于想要保持“浮动窗口”状态(非全屏)的人来说是个问题。 ✅ 目标: 保持浮动窗口模式(Windowed),即使当前屏幕分辨率小于设置的窗口大小。 🎯 解决思路 Godot 引擎中这个行为目前是默认的“安全机制”,但你可以通过如下方法来避免它强制全屏: ✅ 方法 1:运行时手动设置窗口大小并强制浮动模式 在你的主脚本中(例如 autoload.gd 或 Main.gd)添加如下代码,确保窗口总是以“窗口模式”运行,并强制缩小尺寸: // 使用 C# 版本 using Godot; public partial class Main : Node { public override void _Ready() { // 强制取消全屏 DisplayServer.WindowSetMode(DisplayServer.WindowMode.Windowed); // 获取屏幕尺寸 Vector2I screenSize = DisplayServer.ScreenGetSize(); // 获取当前项目设置的窗口大小 Vector2I targetSize = new Vector2I(1280, 720); // 或从 ProjectSettings 读取 // 如果屏幕太小,动态缩小窗口以避免强制全屏 if (targetSize.X > screenSize.X || targetSize.Y > screenSize.Y) { GD.Print("Screen too small, resizing window to fit.

在 Godot 中锁定鼠标光标的方法

在 Godot 中,有几种方法可以锁定鼠标光标,使其不超出游戏窗口。以下是使用 C# 的实现方法: 1. 使用 Input.set_mouse_mode() 方法 这是最常用的方法,Godot 提供了几种鼠标模式: using Godot; public class MouseLock : Node { public override void _Ready() { // 锁定鼠标到窗口中心并隐藏 Input.SetMouseMode(Input.MouseMode.Captured); // 其他可用模式: // Input.MouseMode.Visible - 正常可见模式(默认) // Input.MouseMode.Hidden - 隐藏但可以自由移动 // Input.MouseMode.Captured - 锁定并隐藏(最适合FPS游戏) // Input.MouseMode.Confined - 限制在窗口内但可见 } public override void _Input(InputEvent @event) { if (@event is InputEventKey keyEvent && keyEvent.Pressed) { if (keyEvent.Scancode == (int)KeyList.Escape) { // 按ESC键释放鼠标 Input.SetMouseMode(Input.MouseMode.Visible); } } } } 2.

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 )。

Amplify Imposter Custom Baking

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 原文地址 介绍 标准烘焙器收集延迟的 GBuffer 信息,其中包含典型 PBR 渲染的所有材质数据。然而,这可能并不总是必要的,甚至可能不够。在某些情况下,想要为其创建替代者的对象具有一些特殊的实时着色器效果,而简单的 PBR 渲染无法涵盖这些效果。在其他情况下,可能只想减少生成的数据量,因为有更高的平台限制(即移动设备)。自定义烘焙背后的想法是允许告诉工具想要烘焙什么以及希望如何根据具体情况进行渲染。 ##要求 为本指南创建着色器可能非常困难,因此我们在包中包含了可与 Amplify Shader Editor 插件一起使用的必要模板和节点,从而使该过程变得更加轻松快捷。如果不熟悉它,Amplify Shader Editor 是我们自己的屡获殊荣的着色器编辑器,可以在基于节点的图形编辑器中创建着色器,而无需了解着色器代码。本指南假设使用 Amplify Shader Editor,因此如果对直观的基于节点的着色器创作工具感兴趣,请随时在此处查看其商店页面。还可以在此处的 wiki 页面中了解更多信息。 可以在软件包的目录AmplifyImpostors/Examples/Scenes/CustomBaking中找到本指南的文件和示例。如果是高级用户,并且想要手动创建着色器,仍然可以通过将结果与给定的示例进行比较来遵循指南。 Shader Graph 限制了使用自定义代码的能力,从而阻止了对 Amplify Impostors 的支持。请考虑使用替代方案Amplify Shader Editor,它从头开始设计,可扩展并可适应任何管道要求。 描述 本指南演示了创建与示例中相同的自定义替代器的过程。目的是为包含特殊动态着色器的对象创建替代器。此着色器在对象顶部添加了一个程序化油漆层。此油漆层是程序化的,因为它使用对象位置来计算油漆的伪随机颜色。如果我们为这个对象烘焙一个常规替代器,我们将失去这种程序行为,最终得到一个静态版本。 为了实现这一点,需要两个特殊的着色器。一个着色器将使用被代替的物体的原始着色器来烘焙不同的纹理贴图。此着色器包含不同的输出,这些输出将用于生成不同的纹理及其通道所包含的内容。称为“烘焙着色器”。另一个着色器将使用生成的纹理,并使用可能正在寻找的预期自定义效果,正确渲染地impostor。这是将在产品中使用的创建imposter效果的着色器。我们将其称为“运行时着色器”。最后,需要设置输出并将着色器链接到它们,使用可以在Impostor组件中创建和引用的预设资产文件来执行此操作。 创建烘焙着色器 在的项目中单击鼠标右键,然后创建一个新的 Impostor Bake 着色器。 注意:如果看不到此条目,请确保在着色器编辑器之后导入 Impostors 包,并打开着色器编辑器画布以检测更改。 在编辑器中打开着色器后,首先放置纹理采样器并将它们打包到所选输出,并确保属性名称与原始着色器匹配。 然后创建与我们可以烘焙到地图中的静态部分相对应的图形节点和连接,在我们的例子中,这是除程序颜色部分之外的所有内容。此外,因为我们稍后需要特殊遮罩来重新创建最终的程序效果,并且因为我们想要节省一些纹理内存,所以我们会将其与剩余数据一起打包并将其连接到同一个输出。 添加“Pack Normal Depth”着色器功能节点,它将法线转换为必要的空间并在 Alpha 通道中创建深度信息。 (可选)如果的对象着色器使用“剪切”效果,请确保通过减去剪辑蒙版值并将其连接到“剪辑”输出来模仿它。 创建运行时着色器 在的项目中单击鼠标右键并创建一个新的 Impostor Runtime 着色器。 在编辑器中添加一个新的“Amplify Impostor 节点”,将 Albedo、World Normal 和 Alpha 输出连接到主节点中的可用输入。点击 ASE 画布中的保存按钮。 注意:这样做应该会编译一个使用烘焙中最重要的数据的 Impostor 兼容着色器,但我们仍然需要进一步定制它以支持预期的程序效果。 在我们的例子中,我们想要获取原始输出中没有的自定义地图,我们通过选择 Impostor 节点并将“Extra Samplers”字段更改为适当的数字(在我们的例子中为 1)并连接一个带有名称的纹理对象节点来实现此目的,稍后将使用该名称来引用此地图。在本例中,我们将其称为“_Mask”。 我们现在需要从原始着色器创建程序逻辑,该着色器使用波函数中的对象 XZ 位置来生成颜色。 最后,从额外输出将程序颜色过滤到蒙版,并将适当的通道连接到其输出。保存。 创建烘焙预设 通过转到“Assets > Create > Amplify Impostor Bake Preset”或点击 impostor 组件中的“New”按钮来创建新预设。在所选项目位置中选择它。 将着色器分配给预设并添加或删除输出,直到拥有与在 [步骤 2] 中创建的着色器相同数量的可用输出。 配置输出以表示它们所保存的数据。在本例中,第一个输出保存 RGB 中的反照率颜色数据,因此我们将其标记为 sRGB 颜色空间。务必标记包含 alpha 通道的输出,在本例中它是第一个,因此我们保留单选按钮不变。 现在,只需在 impostor 组件中选择新的预设,必要时覆盖字段并点击“Bake Impostor” 最终结果 这是最终结果,请注意右侧的替代器现在可以模仿原始对象的效果并按预期显示程序颜色。此外,这些替代器仅使用三个贴图来实现它,而不是像标准替代器那样使用四个贴图。

Midjourney常用指令和提示词表格

以下是 Midjourney 全部指令和参数的完整表格(截至最新版本),涵盖基础指令、参数、高级功能及设置选项: Midjourney 完整指令表 指令/参数 类型 说明 示例/用法 基础指令 /imagine 指令 输入提示词生成图像(核心功能) /imagine a mystical forest with glowing mushrooms --v 6 --ar 16:9 /settings 指令 调整默认参数(模型版本、质量、风格等) 选择 MJ Version 6 或 Niji V6(动漫风格) /describe 指令 上传图片生成4组可能的提示词 上传风景图,Midjourney 返回提示词如 “a serene lake at sunset” /info 指令 查看账户信息(剩余生成次数、订阅状态等) 输入后显示剩余Fast时间、订阅计划等 /help 指令 调出官方帮助指南 输入后返回基础教程链接 图像操作指令 /blend 指令 混合2-5张图片生成新图(需上传图片) 上传2张风格不同的插画,生成融合效果 /show 指令 通过任务ID重新显示生成结果(需输入任务ID) /show 1234567890 /fast 指令 切换至快速生成模式(消耗订阅时间) 免费用户默认不可用 /relax 指令 切换至慢速生成模式(不消耗时间,但排队慢) 订阅用户专用 提示词工具 /shorten 指令 优化提示词,删除冗余内容并分析关键词权重 /shorten a portrait of a cyberpunk samurai with neon armor, ultra-detailed /prefer option set 指令 创建自定义参数选项(需高级订阅) /prefer option set my_style --v 6 --stylize 1000 /prefer suffix 指令 为所有提示词添加固定后缀 /prefer suffix --ar 3:2 --chaos 20 /prefer auto_dm 指令 将生成结果私信发送(避免刷屏) 输入后所有结果通过私信发送 参数列表 --v <1-6> 参数 指定模型版本(默认最新版) --v 5.

一些实用的正则表达式

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com 生成一个正则表达式,把每一个中文自然段落前的空格都去掉 可以使用以下正则表达式来去除每个中文自然段落前的空格: 正则表达式: ^[ \t ]+ 替换为: 空字符串(即删除匹配到的内容) 解释: ^ 匹配行的开头(在多行模式下)。 [ \t ]+ 匹配一个或多个: 半角空格( ) 制表符(\t) 全角空格( ,Unicode \u3000) 使用方式: 启用多行模式(/m 标志),使 ^ 能匹配每行的开头。 全局匹配(/g 标志),处理所有符合条件的空格。 示例(JavaScript): const text = ` 这是一个前面有半角空格的段落。 这是一个前面有全角空格的段落。 Another mixed space paragraph.`; const result = text.replace(/^[ \t ]+/gm, ''); console.log(result); 输出: 这是一个前面有半角空格的段落。 这是一个前面有全角空格的段落。 Another mixed space paragraph. 注意事项: 该正则表达式会删除每行开头的所有空格(包括全角/半角),适用于典型的首行缩进场景。 如果段落中存在需要保留的非开头空格(如英文单词间的空格),不会被误删。 如果文本包含代码块等需要保留缩进的结构,建议先提取自然段落再处理。 生成一个正则表达式,删除空白行,纯空格符的行也算空白行 可以使用以下正则表达式删除所有空白行(包括仅含空格/制表符等空白字符的行): 正则表达式: ^\s*$ 替换为: 空字符串(即删除匹配到的整行) 解释: ^ 匹配行的开头(需启用多行模式) \s* 匹配零个或多个空白字符(包括:空格、制表符\t、换页符等) $ 匹配行的结尾(需启用多行模式) 使用方式: 启用多行模式 (/m 标志),使 ^ 和 $ 能匹配每行的开头和结尾 全局匹配 (/g 标志),处理所有符合条件的行 示例(JavaScript):