ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

ShaderGraph实战:2D水面效果从基础到创意应用

ShaderGraph实战:2D水面效果从基础到创意应用 1. 项目概述当2D水面遇见ShaderGraph在2D游戏或交互式应用的开发中水面效果一直是个能极大提升视觉沉浸感和动态表现力的“加分项”。过去要实现一个像样的水面往往意味着要手写复杂的Shader代码这对于很多专注于逻辑和玩法的开发者来说门槛不低。但自从Unity的ShaderGraph这类可视化着色器编辑工具普及后情况就完全不同了。它把那些晦涩的HLSL代码变成了可以拖拽、连接的节点让美术和TA技术美术甚至是有兴趣的程序员都能直观地构建出惊艳的视觉效果。这个项目的核心就是围绕“2D水面效果”这个基础模块用ShaderGraph去挖掘它在不同情境下的创意可能性。我们不止步于做一个会波动的水面贴图而是要探讨如何将这个效果融入游戏叙事、玩法互动和视觉风格塑造中。比如当水面不再只是背景而是能反映天气变化、能与玩家的魔法技能产生互动、能无缝切换到水下世界、甚至能承载独特的艺术风格时整个项目的质感就会截然不同。结合当前的一些技术热点来看比如“2D工业相机”和“AMR 2D移植”虽然它们来自工业视觉和机器人领域但其核心——对2D图像进行精确的算法处理与识别——与我们在Shader中进行的像素级计算和纹理采样在思路上有异曲同工之妙。这提醒我们ShaderGraph不仅是艺术工具其背后是强大的实时图形算法。理解这一点能帮助我们在创意应用时做出更高效、更可控的技术选型。接下来我将以一个实战者的角度拆解如何用ShaderGraph构建一个基础的2D水面Shader并重点深入五大创意应用场景的实现细节、设计思路以及那些只有踩过坑才知道的注意事项。2. 核心思路与ShaderGraph基础构建在开始创意应用之前我们必须先打好地基——创建一个足够灵活且性能可控的基础2D水面Shader。这个基础Shader将作为我们所有创意场景的“原料”。2.1 基础效果的核心节点网络一个典型的2D水面基础效果主要模拟三个视觉特征波动、折射和高光菲涅尔效应。在ShaderGraph中我们可以用以下节点流来实现UV扭曲与波动这是水流动画的核心。我们通常使用一张或两张噪声图Noise Texture或法线图Normal Map来扰动主UV。操作使用Time节点获取游戏时间乘以一个控制流速的Vector1参数比如_Speed通过Tiling And Offset节点对噪声纹理的UV进行平移。然后将平移后的噪声纹理的某个通道通常是R或G通过Remap节点映射到一个小幅度的偏移范围如-0.02到0.02再与原始UV相加。技巧使用两张噪声图以不同速度和方向进行采样并叠加可以创造出更复杂、更自然的湍流效果避免简单的单向滚动显得很假。颜色与透明度基础颜色通常由一张深水区到浅水区的渐变纹理决定采样时使用被扰动后的UV。透明度则用于表现水体的通透感边缘浅水区透明度高中心深水区透明度低这可以通过一个基于UV或屏幕位置的渐变Gradient来控制。折射效果这是实现水下物体扭曲感的关键。原理是采样水底背景纹理时使用被严重扰动后的UV坐标。操作将上述用于颜色采样的UV扰动强度加大生成一套新的“折射UV”。使用Scene Color节点如果渲染管线支持或通过自定义纹理传递来的背景图用这套“折射UV”进行采样。然后将采样结果与水面基础颜色进行混合。注意在2D项目中获取“背景”可能需要一些设置。常见做法是使用第二个摄像机专门渲染水底图层到一张Render Texture上然后在Shader中采样这张纹理。菲涅尔效应与高光菲涅尔效应表现为视线与水面法线夹角越小即掠射角观看反射越强。在2D中我们可以用一个简化的模型来模拟。操作使用Fresnel Effect节点。其本质是基于表面法线在2D水面中我们可以用扰动噪声的导数来近似生成一个动态的法线方向与观察方向在2D中通常是固定的如(0, 0, 1)的点乘结果来产生一个边缘亮、中间暗的遮罩。将这个遮罩与一个高光颜色和强度参数相乘叠加到最终输出颜色上。心得菲涅尔效应是让水面脱离“平面贴图”感拥有体积和光影反应的神来之笔。即使是一个简单的静态法线配合菲涅尔也能立刻提升质感。将这些节点组合起来你就得到了一个具有动态波动、简单折射和边缘高光的基础水面Shader。在ShaderGraph中记得将所有可调节的参数如流速、波动强度、颜色、透明度、菲涅尔强度等都暴露为Property方便在材质球上实时调整。2.2 性能考量与参数化设计在移动端或需要大量实例化的2D项目中性能至关重要。纹理采样优化尽可能复用纹理。例如波动和折射可以共用同一套噪声图采样结果只是扰动强度不同。避免使用分辨率过高的纹理128x128或256x256的噪声图对于大多数2D水面已经足够。计算复杂度Sine、Cosine等周期函数节点虽然能创造规律波动但比简单的纹理平移采样更耗性能。对于大面积水域优先使用纹理动画。复杂的噪声混合如多次Fractional Brownian Motion应谨慎使用或通过参数控制其强度在低端设备上可以关闭。参数化是一切创意的前提将关键控制变量参数化不仅是为了调整方便更是为后续的创意互动打下基础。例如将“全局波动强度”、“主波流速”、“高光强度”等做成Material Property我们就可以在运行时通过脚本C#动态修改这些参数从而让水面响应游戏内事件。3. 创意应用场景一动态天气系统交互让水面成为游戏世界天气变化的“晴雨表”是提升环境动态感和叙事沉浸感的有效手段。我们可以通过Shader参数让水面实时响应雨、风、雾等天气状态。3.1 雨滴涟漪的实时生成下雨时水面不应只是播放一个雨滴动画贴图而应产生动态生成的、相互干涉的涟漪。实现思路在Shader中维护一个“涟漪图”。当游戏逻辑检测到雨滴击中水面某位置屏幕空间或世界空间坐标时通过脚本向Shader传递该位置和强度。在Shader中以该点为中心在一个小范围内例如通过计算当前像素到击中点的距离生成一个波峰并随时间推移让这个波峰向外扩散并衰减。ShaderGraph实现使用一张Render Texture作为“涟漪信息图”每个像素的RG通道可以存储该点的波浪高度和速度。这通常需要配合一个自定义的Compute Shader或另一个简单的Shader来更新这张图模拟波的传播。在主要的水面Shader中采样这张“涟漪信息图”将其高度数据转换为对UV的额外扰动叠加到基础的噪声扰动上。为了性能可以限制同时存在的涟漪数量并采用较低分辨率的Render Texture如128x128。注意事项直接在世界空间计算大量涟漪对性能挑战很大。一个取巧但效果不错的方案是使用多个预设的、不同大小和衰减速度的“涟漪波纹”噪声图当雨滴击中时选择一种叠加到动态UV中并通过脚本控制其出现位置和生命周期。虽然物理准确性稍差但视觉上可以接受且性能友好。3.2 风力对波浪的影响大风天气下水面的波浪应该更剧烈且有明确的主导方向。实现这相对简单。我们之前基础Shader中控制噪声图平移速度的_Speed和方向参数就可以直接与游戏中的“风力”系统挂钩。将_Speed分解为_WindSpeedX和_WindSpeedY。在游戏脚本中根据风向一个二维向量和风力强度实时计算并设置这两个参数到材质。同时风力强度也可以影响波动振幅即UV扰动的强度参数_DistortionStrength。进阶效果强风下可以增加波浪的“尖锐度”。这可以通过在噪声采样后对结果进行一些非线性处理如Power节点来模拟让波峰更突出波谷更平缓。3.3 雾气与水面能见度的融合雾天时远处的景物模糊水面本身也应融入这种朦胧感并减弱高光。实现距离融合在Shader中计算像素点对应的世界空间位置或在2D中使用Sprite的局部位置或UV的Y轴作为深度近似。根据这个“深度”值使用Lerp节点将水面颜色与雾的颜色进行混合。深度越大越远雾色混合比例越高。高光衰减同样基于深度减少菲涅尔高光的强度。可以使用一个Smoothstep节点来控制衰减曲线让远处的湖面高光几乎消失。折射减弱雾天水体透明度降低折射效果应变弱。可以基于深度或一个全局的“雾浓度”参数来降低折射扰动的强度甚至直接Lerp折射效果与未扭曲的背景。技巧为了让雾效更统一最好让水面的雾效计算方式与场景中其他精灵Sprite的雾效Shader保持一致使用同一套雾浓度、雾色和衰减参数这样能确保视觉上的整体协调性。4. 创意应用场景二魔法与技能互动反馈将水面作为技能效果的载体能极大增强魔法的表现力和玩家的操作反馈。这里的关键是实时和动态。4.1 技能冲击波与水面震动当释放一个冲击波类技能如火球术爆炸、雷霆震击时希望以击中点为中心产生一圈扩散的、强烈的波纹。技术方案这与雨滴涟漪类似但强度、范围和速度都更大。更适合采用“涟漪图”或“高度场”的方案。具体操作在技能触发时脚本将击中点的世界坐标、冲击波强度、起始半径等信息传递给负责更新“涟漪图”的脚本或Compute Shader。在更新逻辑中不仅仅是在中心点加一个脉冲而是模拟一个能量环从中心向外急速扩散的过程。这可以在“涟漪图”的更新Shader中通过处理相邻像素的高度差来实现简单的波传播模拟。在主水面Shader中采样这个剧烈变化的“涟漪图”其高度数据不仅要影响UV偏移形成视觉扭曲还可以影响顶点偏移如果水面是网格模型形成真正的隆起甚至影响水面颜色的局部变亮模拟飞溅的水花白光。性能预警全屏范围的精细波动模拟即高分辨率的“涟漪图”实时更新非常消耗性能。务必设置合理的更新频率如每两帧更新一次和纹理分辨率。对于大多数2D游戏一个中等精度256x256的模拟已经能带来震撼的效果。4.2 元素魔法与水面状态改变例如冰魔法击中水面水面应局部结冰毒魔法污染水面使其颜色变绿并产生气泡。实现核心遮罩纹理Mask Texture与参数覆盖。生成遮罩当冰魔法击中时在另一张Render Texture我们称为“状态遮罩图”上以击中点为中心绘制一个圆形或自定义形状的“冰霜区域”。这个区域的值从边缘到中心可以是从0到1。Shader混合在主水面Shader中采样这张“状态遮罩图”。在遮罩值为1的区域完全结冰我们完全用另一套Shader逻辑来渲染UV扰动几乎停止_Speed降为0。颜色替换为冰的纹理或颜色并增加强烈的镜面高光调整Fresnel Effect参数。折射效果减弱或变为冰面下模糊的折射。甚至可以叠加一层冰裂纹的噪声纹理。通过Lerp节点根据遮罩值在“正常水面”和“冰面”的渲染结果之间进行平滑混合。边缘区域遮罩值在0到1之间的混合会产生自然的过渡效果。动态变化结冰过程可以是动态的。脚本可以控制绘制到“状态遮罩图”上的区域逐渐扩大模拟冰面蔓延。同样冰融化时可以逐渐擦除遮罩图上的区域。4.3 持续性区域效果例如在水面上持续燃烧的火焰路径或一个持续散发寒气的冰霜领域。实现这类效果是上述“状态改变”的持续化版本。关键在于“状态遮罩图”的持续更新和维护。火焰路径可以每帧在“状态遮罩图”上沿着预设或动态路径绘制带有衰减的“热度”值。在水面Shader中高热区域表现为剧烈沸腾UV扰动极快、颜色变红/黄、并叠加火焰粒子的屏幕空间特效这可能需要与粒子系统配合而非纯Shader。维护成本需要一套轻量级的系统来管理这些持续性的状态区域包括它们的生命周期、位置更新和强度衰减。避免无限制地添加区域导致性能下降和遮罩图信息混乱。5. 创意应用场景三水下视角转换与视觉特效这是从“看水”到“在水中看”的视角转换能创造出极具沉浸感的关卡或场景。核心挑战是如何在2D限制下表现水下光线、模糊和焦散等效果。5.1 屏幕空间后处理与色彩偏移当镜头转入水下整个屏幕应被一层水下的视觉特效覆盖。实现方法最优雅的方式是使用全屏后处理Post-processing。创建一个后处理Shader在水下场景时启用。核心效果色彩偏移模拟水体对光线的吸收通常红色光最先被吸收。可以使用Channel Mixer节点或分别对RGB通道进行轻微偏移来实现整体偏蓝绿的效果。模糊与扭曲水下视线不清。可以叠加一个轻微的全屏模糊如Gaussian Blur并在模糊前对屏幕UV施加一个缓慢的、大范围的噪声扰动模拟水流的扭曲感。这个扰动应与水面的波动有所关联但频率更低、幅度更小。光线衰减与体积光从水面射入水下的光线会形成光束。这可以通过采样深度图结合屏幕空间位置在较深的区域或距离水面较远的区域叠加一个渐变的暗角并在某些角度如从水面高光处绘制一些光柱效果。在2D中光柱可以用径向模糊或精心制作的粒子来模拟。注意事项后处理效果对性能有影响尤其是模糊。在移动端可以考虑使用更高效的模糊算法如Kawase Blur或者降低采样次数。确保水下效果有一个平滑的过渡淡入淡出避免视觉上的突兀切换。5.2 动态焦散效果模拟焦散是光线通过波动的水面后在水底或物体上形成的明亮光斑图案是水下场景真实感的关键。简化实现方案在2D中我们可以用一个“取巧”但有效的方法。准备一张焦散纹理这是一张黑白或带有亮斑的透明纹理图案类似破碎的光斑。投影与动画在水面Shader中我们不是将焦散画在水面上而是“投影”到水下的背景上。使用经过扰动的水面法线信息或直接用扰动后的UV对焦散纹理进行采样。叠加模式将采样到的焦散纹理以Additive相加或Screen滤色的混合模式叠加到最终渲染的水下背景或场景物体上。这样随着水面波动水底的光斑也会随之移动、变形。控制强度焦散效果在浅水区、阳光直射处应该更明显。可以通过一个基于深度或离水面的距离和表面法线与光源方向夹角的遮罩来控制其强度。进阶思路更物理的方案是使用光线追踪或投影贴图技术但在2D实时渲染中性价比太低。上述纹理动画方案在大多数艺术风格化的2D游戏中已经足够令人信服。5.3 水面交界处的视觉处理镜头一半在水上一半在水下时交界线水线的处理至关重要。问题简单的裁剪会让交界处显得生硬且水下的后处理效果会错误地应用到水上的部分。解决方案水线扭曲与泡沫在水面Shader中识别靠近水线通常由一张渐变贴图或基于世界空间Y值的阈值来定义的像素。对这些像素施加更强的UV扰动并叠加一层半透明的“泡沫”或“浪花”纹理使交界处自然模糊、破碎。后处理遮罩为后处理效果生成一个遮罩。这个遮罩在水下区域为1水上区域为0。可以通过一个位于水面位置的平面其Shader根据深度写入一个Stencil值或渲染到一张遮罩纹理来定义。后处理Shader只对遮罩值为1的区域应用效果。这样就能实现精确的水下视觉特效而不影响水上部分。折射交界在水线附近折射效果应该最强。可以调整折射扰动的强度使其在水线处达到峰值向上下两侧衰减。6. 创意应用场景四风格化与艺术表达ShaderGraph不仅能模拟真实更是塑造独特艺术风格的利器。通过调整节点网络我们可以让水面呈现出油画、像素风、水墨等迥异的视觉风格。6.1 色块化与像素风水面将连续的波动和色彩变化离散化为大块的色块或明显的像素。实现关键量化Quantization节点。颜色量化在计算最终颜色输出前加入一个量化步骤。例如使用Round节点将颜色的RGB分量范围0-1乘以一个色阶数如8取整后再除以该数。这会将平滑的渐变变为阶梯状的色带。UV与波动量化对用于采样纹理的UV坐标也进行量化。将扰动后的UV乘以一个放大系数降低有效分辨率取整Floor或Round再除以该系数。这会使水面的波动呈现出“锯齿状”或“块状”的移动非常契合像素游戏的风格。减少细节关闭或减弱菲涅尔高光这类产生平滑过渡的效果。折射效果也可以简化甚至用简单的颜色偏移代替复杂的纹理采样扭曲。风格协调确保水面的量化阶数与游戏内其他精灵的色板保持一致UV量化的“块大小”也与游戏的整体像素比例匹配。6.2 手绘质感与笔触模拟模拟油画或水彩画中笔触和颜料混合的感觉。实现手法笔触纹理叠加使用一张带有方向性笔触的噪声纹理作为基底。将水面的波动体现为这张笔触纹理的流动和扭曲而不是传统的光滑噪声。颜色混合模式模仿水彩的“湿边”效果。可以使用Posterize节点进行适度的颜色量化后再通过Smudge或自定义的模糊节点让色块边缘产生轻微的相互渗透和混合而不是清晰的边界。纸张质感在最终输出前叠加一张纸张纹理如画布、水彩纸的扫描图并使用Overlay或Multiply混合模式让水面颜色仿佛画在纸上带有纸张的纹理和吸水性。节点技巧多使用Blend节点尝试不同的混合模式如Overlay,Soft Light,Hard Light它们能创造出丰富的色彩叠加效果模拟颜料的层次感。6.3 动态轮廓线与卡通渲染为水面加上动态的、风格化的轮廓线增强卡通感。实现在Shader中检测颜色或深度的“边缘”。索贝尔Sobel边缘检测这是一个经典算法。在ShaderGraph中可以通过采样当前像素周围8个点的颜色值或法线值、深度值进行加权计算得到一个边缘强度。强度高的地方就是轮廓。应用将计算出的边缘强度用来控制输出一条固定颜色的线如黑色。可以将这条线直接加到最终颜色上或者通过Outline渲染管线在后期单独渲染。动态轮廓有趣的是由于水面本身在波动其颜色和“深度”扰动强度也在变化因此通过这种方法检测出的轮廓线也是动态的会随着波浪起伏而流动形成非常独特的卡通水体效果。性能注意全屏的边缘检测计算量较大。可以降低采样精度如每2像素采样一次或仅在需要强调卡通风格的角色/物体周围使用。7. 创意应用场景五结合游戏机制的玩法设计让Shader效果直接参与游戏玩法成为解谜或挑战的一部分能将视觉表现提升到新的高度。7.1 作为动态路径或可穿越地形水面不再是障碍而是需要特定条件才能通过或揭示路径的机制。案例凝冰渡河正常情况下水面是液体角色无法站立。当玩家使用冰系技能或道具后水面Shader根据技能范围实时渲染出结冰区域应用场景二的技术。只有冰面区域角色的碰撞体才被启用允许行走。Shader的视觉变化与游戏的物理逻辑直接绑定。实现联动这需要游戏逻辑脚本与Shader材质进行紧密通信。脚本检测技能释放计算影响范围并将这个范围以纹理、网格或参数形式传递给水面Shader驱动视觉变化。同时脚本也通知游戏的物理或导航系统在对应区域更新可行走状态。设计要点视觉反馈必须清晰即时。冰面与水面的区分要足够明显颜色、反光、波动静止。过渡动画结冰/融化要流畅给玩家明确的操作反馈。7.2 作为环境谜题的信息载体利用水面的折射、反射或特殊状态来隐藏或揭示关键信息。案例折射解密一块刻有谜题的石碑沉在水底。由于水面的波动折射玩家从水面直接看下去石碑上的文字是扭曲无法辨认的。玩家需要找到方法让水面“平静”下来如解决一个机关、等待风停当Shader中的波动参数降为0时折射消失石碑文字清晰显现。案例倒影提示在平静的水面关闭波动增强镜面反射上会显示出岸边实际不存在的物体的倒影如一座隐藏的桥提示玩家探索的方向。技术实现这需要动态控制Shader参数波动强度、反射强度以及渲染不同的内容到反射/折射纹理中。谜题的设计要巧妙让Shader效果成为解谜的核心逻辑而不是单纯的装饰。7.3 基于水面状态的角色增益/减益角色站在不同状态的水面上会获得不同的效果。实现框架状态检测角色脚底或碰撞体持续检测所处位置的水面状态。这可以通过读取角色位置对应的水面材质参数来实现例如通过脚本采样前面提到的“状态遮罩图”或者向Shader传递角色坐标并返回一个状态值。效果触发根据检测到的状态普通水、冰面、沸水、毒水等脚本为角色添加相应的状态效果。冰面移动速度加快但转向和控制性降低易打滑。沸水持续受到伤害。毒水中毒持续掉血并可能降低属性。魔法水域站在上面可能持续恢复法力或增强某种法术效果。视觉与逻辑同步确保Shader渲染出的状态区域与游戏逻辑检测的区域完全匹配避免玩家看到的是冰面踩上去却掉进水里的情况。这通常需要美术和策划对状态区域的边界和渐变有统一的定义。8. 实战调试与性能优化全记录无论效果多么炫酷最终都要在真机上稳定运行。这部分分享在实现上述效果时必然会遇到的坑和优化策略。8.1 常见视觉瑕疵与修复方案问题折射边缘闪烁或撕裂原因这是2D水面折射最常见的问题。当使用被严重扰动的UV去采样背景纹理时如果背景纹理的Wrap Mode不是Clamp在UV值超出0-1范围时会采样到纹理另一侧造成突兀的接缝。更糟糕的是在波动剧烈时相邻像素可能采样到纹理上完全不相邻的点导致视觉上的“撕裂”。解决方案使用Clamp模式确保用于折射的背景纹理Render Texture的Wrap Mode设置为Clamp。但这只能解决边界接缝无法解决内部撕裂。深度缓冲与软边缘如果可用在3D或2.5D中可以使用深度测试来只对水面以下的物体进行折射。在纯2D中一个替代方案是准备一张“水下区域”的遮罩图只在这个区域内应用强折射边缘区域让折射强度渐变为0。后处理折射更稳定的方案是采用屏幕空间后处理来做折射。先正常渲染水下物体然后在后处理阶段对整个屏幕应用一个基于水面法线图的、均匀的扭曲。这样避免了逐像素UV跳跃过大导致的采样问题。问题波动不自然像一张平移的贴图原因只使用单一方向、单一频率的噪声图平移。解决务必使用至少两张不同缩放、不同速度、运动方向略有差异的噪声图进行叠加混合。还可以加入一个非常缓慢的、大尺度的底层波动和一个快速的小尺度波纹模拟自然水体多频共存的特性。问题菲涅尔效果生硬像一圈发光的边原因Fresnel Effect节点的参数设置不当或者表面法线信息过于单一。解决调整菲涅尔的力量Power和强度Intensity参数。更关键的是输入给菲涅尔节点的法线不要用固定的(0,0,1)而应该使用从波动噪声中计算出的动态法线通过DDX和DDY节点求UV扰动的梯度来近似。这样高光会随着波浪起伏而流动更加自然。8.2 多平台性能优化策略精度取舍在移动端将Shader中大部分float精度改为half。对于颜色计算和UV偏移half精度通常足够能显著节省带宽和计算资源。纹理压缩与尺寸所有噪声图、法线图尽可能使用压缩格式如ASTC并严格控制尺寸。用于实时更新的Render Texture如涟漪图、状态遮罩图分辨率可以很低64x64或128x128视觉上往往够用。指令数优化合并计算检查节点图看是否有重复的计算路径可以合并。例如多个效果需要用到“扰动后的UV”就只计算一次存到一个中间变量中供各处使用。简化复杂节点减少Custom Function节点中过于复杂的数学运算。如果某些效果在低端设备上非必需使用Shader Variant或通过Keyword开关来禁用。避免全屏复杂后处理水下视觉特效这类后处理在低端设备上可以考虑降级或关闭。可以提供画质选项让玩家选择。批处理与合批如果场景中有大量使用同一水面Shader但参数不同的水面物体如多个小水坑要关注Draw Call。尽量通过纹理图集Texture Atlas或共享材质实例通过MaterialPropertyBlock设置不同参数来促进动态合批。避免每个小水面都是一个独立的材质实例。8.3 与游戏逻辑的高效通信MaterialPropertyBlock vs 直接修改Material如果需要频繁修改大量水面物体的Shader参数如全局天气变化为每个物体的Renderer创建并设置MaterialPropertyBlock是比直接修改Material属性更高效的方式因为它不会破坏材质实例的共享从而不影响合批。参数更新频率不是每一帧都需要更新所有参数。例如风力、雨滴涟漪的扩散可以以较低的频率如每秒10次进行更新视觉上几乎无差异但能减少CPU到GPU的数据传输。使用Texture作为数据接口对于需要传递复杂空间信息的情况如多个技能影响区域使用一张低精度的Render Texture作为“数据地图”传递给Shader比传递大量数组参数要高效和灵活得多。Shader中只需采样这张图就能获取任意位置的状态值。
返回列表