DirectX11 HLSL像素着色器报错求助:SV_PrimitiveID相关问题
问题解决:ps_4_0_level_9_3下的像素着色器错误
错误原因
ps_4_0_level_9_3是为兼容Direct3D 9.x硬件设计的低版本着色器模型,存在两个关键限制:
- 不支持
SV_PrimitiveID语义作为像素着色器的输入 - 不允许像素着色器接收整数类型(
uint)的输入参数
解决方案
方案1:升级着色器模型
将像素着色器的编译目标升级到ps_4_0及以上版本(推荐ps_5_0),即可直接支持SV_PrimitiveID和整数输入:
- 在项目属性的「着色器」配置中,将对应着色器项的「着色器模型」设置为
ps_5_0 - 或者在编译命令中添加参数:
/ps_5_0
方案2:兼容低版本模型的替代方案
如果必须保留ps_4_0_level_9_3兼容,需要通过顶点着色器转译primitive ID:
- 修改顶点着色器,将
SV_PrimitiveID转为float类型传递给像素着色器:
struct PSInput { float4 pos : SV_POSITION; float primitiveID : TEXCOORD0; }; PSInput main(uint vid : SV_VertexID, uint pid : SV_PrimitiveID) { PSInput o; // 替换为你的顶点位置计算逻辑 o.pos = float4(0.0, 0.0, 0.0, 1.0); o.primitiveID = (float)pid; return o; }
- 修改像素着色器,接收float类型的primitiveID并转为uint使用:
cbuffer CBuf { float4 face_colors[6]; }; float4 main(float primitiveID : TEXCOORD0) : SV_Target { uint tid = (uint)primitiveID; return face_colors[tid / 2]; }
关于之前尝试无效的说明
- 「排除在编译外」无效:可能项目中其他代码仍在引用该着色器文件,导致编译过程仍会处理它
- 指定
/ps无效:该参数仅标记文件为像素着色器,但未修改编译使用的着色器模型版本,因此限制仍存在
内容的提问来源于stack exchange,提问作者zavoevatelgribov
相关产品推荐
相关产品推荐

