GLSL: Shader cannot be patched for instancing.

本文描述了作者在Unity中遇到的一个错误,源于Terrain组件的DrawInstanced选项被勾选。问题在2021年出现但在2022年消失,对于无法升级版本的用户,提供了解决此bug的方法。

最近在 unity 里碰到了这么一个错误,只有这么点信息,让人看着挺懵逼的,后来发现,是因为 unity 的 terrain 组件在设置里勾了 Draw Instanced 选项导致的,感觉应该是 unity 的 bug。

因为错出在 2021,2022就没这个问题,如果你也碰到了,且没法换版本的时候,可以尝试这么去搞一下。

当遇到 “ArgumentNullException: Value cannot be null. Parameter name: shader” 错误,通常意味着在代码中尝试使用了一个空的 Shader 对象。以下是一些可能的解决方法: ### 检查 Shader 是否被正确加载 确保在代码中正确加载了 Shader。在 Unity 中,常见的加载 Shader 的方式是使用 `Shader.Find` 方法。示例代码如下: ```csharp Shader myShader = Shader.Find("YourShaderName"); if (myShader != null) { Material myMaterial = new Material(myShader); // 继续使用材质 } else { Debug.LogError("Shader not found!"); } ``` ### 检查 Shader 是否被包含在构建中 在 Unity 中,打包时可能会遗漏某些 Shader。可以通过以下步骤确保 Shader 被包含在构建中: 1. 打开 “Edit” -> “Project Settings” -> “Graphics”。 2. 在 “Always Included Shaders” 列表中,添加可能会用到的 Shader。 ### 逐步排查代码逻辑 按照引用[4]的建议,可以先写一个简单的 Shader,例如让物体简单变成红色,赋值到一个默认的 Cube 或 Sphere 上,逐步排查是哪里出了问题。示例代码如下: ```glsl Shader "Custom/SimpleRedShader" { SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag struct appdata { float4 vertex : POSITION; }; struct v2f { float4 pos : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); return o; } fixed4 frag (v2f i) : SV_Target { return fixed4(1, 0, 0, 1); // 红色 } ENDCG } } } ``` 然后在代码中使用这个简单的 Shader: ```csharp Shader simpleShader = Shader.Find("Custom/SimpleRedShader"); if (simpleShader != null) { Material simpleMaterial = new Material(simpleShader); GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube); cube.GetComponent<MeshRenderer>().material = simpleMaterial; } ``` ### 检查资源路径和名称 确保在代码中使用的 Shader 名称和路径是正确的,大小写也要一致。如果 Shader 位于特定的文件夹中,需要提供完整的路径。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值