如何让Graphics.DrawMesh在HDRP编辑器场景视图中生效?
问题:HDRP编辑器场景视图中
Graphics.DrawMesh无法显示,DrawMeshNow无灯光交互 核心需求
- 在Unity HDRP的编辑器场景视图中绘制可与灯光交互的网格
- 优先使用
Graphics.DrawMesh(DrawMeshNow无法和灯光交互)
已尝试操作
- 将
Graphics.DrawMesh代码放入Update()、OnPreRender()、OnPostRender()、OnPreCull()、OnEnable()、OnDisable()、OnRenderObject()、OnDrawGizmos()、OnGUI()等所有相关生命周期函数 - 添加
[ExecuteInEditMode]特性,将脚本挂载到相机及其他不同GameObject上 - 尝试寻找强制
Graphics.DrawMesh立即绘制的方法,无结果 - 测试
Gizmos.DrawMesh:可正常显示,但无法分配材质 - 确认使用的材质Shader为
HDRP/Lit,排除Shader适配问题
当前临时方案(DrawMeshNow取巧)
将DrawMeshNow放入OnDrawGizmos并挂载到相机上,配合Material.SetPass()指定通道:
- 通道2:适配无透明通道的纯色材质
- 通道8:适配所有材质(含透明),但强制正面剔除,无法通过Mesh设置或材质Cull Mode修改
- 通道9:适配Surface Type为Transparent的材质,需勾选Depth Write才能正常显示(否则alpha=255也会透视)
- 该方案原理不明,且
DrawMeshNow始终无法与灯光交互
解决方案:让Graphics.DrawMesh在HDRP编辑器场景视图正常工作
关键实现要点
绑定场景视图相机+正确生命周期
在OnRenderObject()中调用Graphics.DrawMesh,脚本必须挂载到场景视图的相机上(编辑器场景视图有独立相机,不是Game视图相机),同时添加[ExecuteInEditMode]和[RequireComponent(typeof(Camera))]特性。适配HDRP的SRP渲染参数
HDRP基于SRP,需通过RenderParams传递正确的相机、边界等参数,示例代码:[ExecuteInEditMode] [RequireComponent(typeof(Camera))] public class DrawMeshInEditor : MonoBehaviour { public Mesh targetMesh; public Material targetMaterial; public Matrix4x4 meshMatrix = Matrix4x4.identity; private void OnRenderObject() { if (targetMesh == null || targetMaterial == null) return; RenderParams renderParams = new RenderParams(targetMaterial); renderParams.camera = GetComponent<Camera>(); renderParams.renderLayerMask = -1; // 渲染所有层 renderParams.worldBounds = targetMesh.bounds; Graphics.DrawMesh(renderParams, targetMesh, meshMatrix); } }灯光交互的必要条件
- 材质使用HDRP兼容Shader(如
HDRP/Lit),且默认开启的接收光照选项未被关闭 - 场景灯光需设置为影响网格所在的层
- 材质使用HDRP兼容Shader(如
验证步骤
- 将上述脚本挂载到场景视图相机(可通过
SceneView.lastActiveSceneView.camera获取,或手动拖入) - 赋值目标Mesh和
HDRP/Lit材质 - 切换到场景视图,即可看到网格正常显示并与灯光交互
内容的提问来源于stack exchange,提问作者Piggy Chu
相关产品推荐
相关产品推荐

