【unity】unity2021 URP管线下 SceneView没有MipMaps选项了怎么办?扩展Rendering Debugger工具
一、前言
之前项目 Unity打开后 Scene窗口 有一个MipMaps选项模式, 可以查看哪些贴图正常距离下发红 ,说明用不到那么大,可以缩一下尺寸。
但 新的项目在Unity2021上,用了URP, 就没见过这个选项。
查了一篇介绍详细的资料,学习了不少知识,【Unity URP】Rendering Debugger和可视化MipMap方案-CSDN博客
但当时漏看了 这个插件 Scene View Debug Modes in the Unity URP — John Austin 所以没看明白 Scene窗口怎么在Debug里加选项的。导致后面试验都走不下去。
不过正好让我研究了一下Rendering Debugger工具实现,发现URP其实本身自带渲染mipaps的功能,(只不过 ShaderGraph做的shader 和 完全自己写的shader 会不起作用,所以估计没开放出来。)。 Debug.hlsl里有一些 GetDebugMipColor 这样的接口了。
【注:如果纯手工写的shader比较多, 建议还是用前面一篇文章里介绍的方法试试,若用URP自带的这个方案需要改造、改造起来不太方便。 本人试验了,上面这个插件不错 结合源博主的方案,且自己写的Shader 主帖图统一命名成_BaseMap就行。 附带 插件方案的 shader:DebugMipmaps.shader】
二、Rendering Debugger 扩展方案
Tools->Analysis->Rendering Debugger, 可以打开这个工具,
Material Override 里加一个 Mipmaps选项
要修改 URP渲染管线里的代码,所以首先要把 项目Library\PackageCache下com.unity.render-pipelines.universal@xx.x.xx 复制到,项目的 Packages目录下,否则修改都会被还原。
- DebugViewEnums.cs 里DebugMaterialMode枚举最末尾加一个 Mipmaps
- DebugViewEnums.cs.hlsl 里 加一个 #define DEBUGMATERIALMODE_MIPMAPS (12)
- Debugging3D.hlsl 里 参考 DEBUGMATERIALMODE_METALLIC枚举,加一个
case DEBUGMATERIALMODE_MIPMAPS:
debugColor = half4(GetDebugMipColor(surfaceData.albedo, inputData.texelSize, inputData.uv),1);
return true;
这样就加好了,选择这个模式可以看到 URP自带的 Lit等shader 渲染的物体已经能看到效果了。 其他用 Shader Graph做的shader渲染的都是 蓝色的……
三、让自定义Shader或Shader Graph做的shader也支持 mipmaps 调试模式
(一)原因
先说结论:不生效的shader没调用 SETUP_DEBUG_TEXTURE_DATA ,导致没填充对应数据。
研究发现 不生效的shader, 获取inputData.texelSize出来的值都是0
看了一下 Lit.shader的源码,调用了 LitForwardPass.hlsl
里面有一句:
SETUP_DEBUG_TEXTURE_DATA(inputData, input.uv, _BaseMap);
看相关定义 就知道要提供什么了。
搜索整个项目 SETUP_DEBUG_TEXTURE_DATA,还发现URP自带几个头文件 注释掉了 它的调用,看说明就是针对 Shader Graph的, 应该是没有通用性,需要自己定好参数:
(二)Shader Graph的做的Shader的解决方案
把 PBRForwardPass.hlsl里的 SETUP_DEBUG_TEXTURE_DATA(inputData, unpacked.texCoord1.xy, _MainTex); 语句打开 ,然后开启Mipmaps模式
这边项目有shader代码报错:
Shader error in 'Shader Graphs/PbrModelSample2': invalid subscript 'texCoord1' at /work/atm2_D241023/Packages/com.unity.render-pipelines.universal@12.1.11/Editor/ShaderGraph/Includes/PBRForwardPass.hlsl(85) (on d3d11)
原因是 这边只用到了uv0, 所以 texCoord1 要改成 texCoord0
接着 这边项目还是有一个报错:说 undeclared identifier '_MainTex_MipInfo' at ……
原因是 shader里没定义一个 _MainTex_MipInfo, 那就把我们自己做的shader报错的都加一个Vector4变量 _MainTex_MipInfo:
保存没报错后,能看到成果:
总结方案就是:
1.把shader graph用到到的 PBRForwardPass.hlsl里的 打开注释,改成: SETUP_DEBUG_TEXTURE_DATA(inputData, unpacked.texCoord0.xy, _MainTex);
2.自己做的shadergraph 如果报错,看一下是否主贴图命名为_MainTex 是否定义了 Vector4 的_MainTex_MipInfo
(三)自定义shader的解决方案
可以自行参考 LitForwardPass.hlsl的片元着色器代码实现, 具体没试验,不能做定论。大致是:
- 组织一个 InputData inputData;结构,
-
调用 SETUP_DEBUG_TEXTURE_DATA(inputData, input.uv, _BaseMap(主贴图的名字));
(注:shader里 要声明 float4 主贴图名字_TexelSize; float4 主贴图名字_MipInfo; ) - 后面调用 UniversalFragmentPBR ,如果全部自己写的 则要自行加一下类似的调用:
反正就是要类似调用到 CanDebugOverrideOutputColor 如果返回true 则直接绘制 debugColor:#if defined(DEBUG_DISPLAY) half4 debugColor; if (CanDebugOverrideOutputColor(inputData, surfaceData, brdfData, debugColor)) { return debugColor; } #endif
-
对了shader里应该也要加一下
#pragma multi_compile_fragment _ DEBUG_DISPLAY -
这边尝试改造了一个 遇到了贴图相关的不少报错, 它还是调用 UniversalFragmentPBR本身的……
四、附带一个Rendering Debugger的知识点, 真机上可能用(可能要打成dev模式)
Unity_URP_Rendering Debugger 调试入门之(一)-CSDN博客 查看里面介绍:
在手机上 三指同时双击屏幕(3指间距要大一些),就会出现如下的菜单:
项目优化掉了 Debug变体,则会出现这样的提示,需要改一下URP设置: