You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. 修改顶点着色器,将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;
}
  1. 修改像素着色器,接收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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 11:40:59