Unity 5.6迁移至2017.4时自定义后处理Shader DX11编译报错求助
解决Unity 2017.4迁移后DX11顶点声明创建失败的Shader问题
这个报错Assertion failed: Failed to create DX11 vertex declaration; something wrong with vertex shader input data? (hr=80070057)本质是DX11无法匹配你的Shader顶点输入和Unity后处理管线传递的顶点数据,错误码80070057表示“参数无效”,通常是顶点着色器的输入结构和Unity预期的不匹配导致的。结合你提供的Shader片段,问题大概率出在顶点着色器的定义上——Unity 5.6到2017.4之间,后处理管线的顶点数据传递逻辑有调整,DX11的验证也更严格了。
具体修复步骤:
规范顶点着色器的输入输出结构
你需要使用Unity内置的后处理顶点数据结构,或者明确声明符合要求的顶点属性。Unity的后处理管线会传递包含位置和UV的顶点数据,你的Shader必须正确接收这些数据。补全Shader的关键缺失部分
你的Shader片段里只写了#pragma target 3.0 #in...,明显缺少顶点着色器的定义、片元着色器的绑定声明。以下是修复后的完整Shader示例:
Shader "SG/Stretch Shadows" { Properties { _MainTex ("Light texture", 2D) = "white" {} } SubShader { LOD 100 Blend One Zero Cull Off ZWrite Off Lighting Off Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma target 3.0 // 引入Unity内置CG工具库,兼容后处理管线 #include "UnityCG.cginc" // 定义符合Unity后处理要求的顶点输入结构 struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; // 定义顶点到片元的传递结构 struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; v2f vert (appdata v) { v2f o; // 使用Unity推荐的坐标转换方法,适配不同渲染设置 o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { // 替换成你原本的阴影拉伸逻辑即可 fixed4 col = tex2D(_MainTex, i.uv); return col; } ENDCG } } }
为什么这个修复有效?
- Unity 2017.4的DX11渲染路径对顶点声明的格式匹配要求更严格,原来5.6中可以“兼容”的隐式顶点输入(比如省略属性声明)不再被允许。
- 使用
UnityObjectToClipPos替代旧的mul(UNITY_MATRIX_MVP, v.vertex)是Unity官方推荐的写法,能适配不同的管线配置。 - 明确绑定顶点和片元着色器阶段(
#pragma vertex vert和#pragma fragment frag)确保Shader的渲染流程被正确识别。
如果你的Shader原本有自定义的阴影拉伸逻辑,只需要把frag函数里的示例代码替换成你原来的实现即可。
内容的提问来源于stack exchange,提问作者David Coombes




