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

ReShade计算着色器报错X4532:无法映射到cs_5_0指令集求助

解决ReShade计算着色器X4532错误的方案

错误X4532 cannot map expression to cs_5_0 instruction set的根源是计算着色器中使用了像素/顶点着色器专属的采样函数tex2D,cs_5_0指令集不支持这个函数在计算着色器里调用。以下是具体问题和修正方案:

核心问题分析

计算着色器不能用tex2D采样纹理,必须使用适合计算着色器的纹理访问方式:比如使用纹理的Load方法(按像素索引直接读取),或者tex2Dlod(需明确指定MIP层级)。你的代码里用tex2D采样ReShade::BackBuffer,违反了cs_5_0的指令集规范,导致编译错误。

另外还有两个小问题需要修正:

  • (float) id.xy的类型转换错误,id.xy是uint2类型,直接转成float会丢失维度,应写成float2(id.xy)
  • DispatchSizeX/Y使用浮点数除法,而Dispatch参数要求是整数,可能导致线程组数量计算不准确

修正后的完整代码

#include "ReShade.fxh"

texture2D renderTarget { Width = BUFFER_WIDTH; Height = BUFFER_HEIGHT; Format = RGBA8; };
storage2D storageTarget{ Texture = renderTarget; };
sampler2D sampleTarget { Texture = renderTarget; MinFilter = POINT; MagFilter = POINT; };

void compute(uint3 id : SV_DispatchThreadID)
{
    // 计算着色器中用Load方法直接读取BackBuffer的像素,无需纹理坐标转换
    float4 backBufferColor = ReShade::BackBuffer.Load(uint3(id.xy, 0));
    tex2Dstore(storageTarget, id.xy, backBufferColor);
}

float3 finalPass(float4 vpos : SV_Position, float2 texcoord : TexCoord) : SV_Target
{
    return tex2D(sampleTarget, texcoord).rgb;
}

technique test
{
    pass
    {
        ComputeShader = compute<8, 8>;
        // 用ceil确保线程组数量为整数,覆盖所有像素
        DispatchSizeX = ceil(BUFFER_SCREEN_SIZE.x / 8.0);
        DispatchSizeY = ceil(BUFFER_SCREEN_SIZE.y / 8.0);
    }
    pass
    {
        VertexShader = PostProcessVS;
        PixelShader = finalPass;
    }
}

关键修正点详解

  1. 替换采样方式:用ReShade::BackBuffer.Load(uint3(id.xy, 0))代替tex2D,Load方法直接通过像素整数坐标(配合MIP层级0)读取颜色,完全符合计算着色器的指令集要求。
  2. 修正线程组计算:用ceil函数确保即使屏幕尺寸不能被8整除,也会生成足够的线程组覆盖所有像素,避免边缘像素遗漏。
  3. 移除冗余坐标转换:Load直接用像素索引,不需要再乘以BUFFER_PIXEL_SIZE转换为纹理坐标,简化逻辑。

内容的提问来源于stack exchange,提问作者The Armored Panda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 22:40:10