【问题标题】:How do you display something using directX 11 compute shader?如何使用 directX 11 计算着色器显示某些内容?
【发布时间】:2023-03-03 09:43:01
【问题描述】:

我想从我的 directX 11 计算着色器中写入纹理。但是我不知道如何在屏幕上显示它,也不确定我应该使用哪种缓冲区来执行此操作。

【问题讨论】:

    标签: c++ graphics hlsl directx-11 compute-shader


    【解决方案1】:

    欢迎使用 stackoverflow :)

    要选择的资源类型是RWTexture2D<float4>,因为您可以通过交换链直接在屏幕上打印它。 您可以查看 DirectX SDK OIT 示例:

    他们声明了一个RWTexture2D<float4> frameBuffer,他们在OIT_CS.hlsl的函数SortAndRenderCS中访问。

    // convert the color to floats
    float4 color[3];
    color[0].r = (r0 >> 0  & 0xFF) / 255.0f;
    color[0].g = (r0 >> 8  & 0xFF) / 255.0f;
    color[0].b = (r0 >> 16 & 0xFF) / 255.0f;
    color[0].a = (r0 >> 24 & 0xFF) / 255.0f;
    
    color[1].r = (r1 >> 0  & 0xFF) / 255.0f;
    color[1].g = (r1 >> 8  & 0xFF) / 255.0f;
    color[1].b = (r1 >> 16 & 0xFF) / 255.0f;
    color[1].a = (r1 >> 24 & 0xFF) / 255.0f;
    
    color[2].r = (r2 >> 0  & 0xFF) / 255.0f;
    color[2].g = (r2 >> 8  & 0xFF) / 255.0f;
    color[2].b = (r2 >> 16 & 0xFF) / 255.0f;
    color[2].a = (r2 >> 24 & 0xFF) / 255.0f;
    
    float4 result = lerp(lerp(lerp(0, color[2], color[2].a), color[1], color[1].a), color[0], color[0].a);
    result.a = 1.0f;
    frameBuffer[nDTid.xy] = result;
    

    如您所见,它们有 r0r1r2 uint 实际上是 RGBA 颜色(每个通道一个字节)的值,它们使用移位和掩码提取每个通道并将其标准化。

    当然,如果您已经有 float4 值,则不需要这样做。 然后他们做那些 lerps(用于插值)。同样,您不需要这样做。 您感兴趣的是他们使用数组表示法访问frameBuffer,并使用uint2 获取坐标。

    【讨论】:

    • 请注意,在 DX11 中,您没有绑定到交换链的 float4 帧缓冲区,您也可以拥有交换链支持的任何 DXGI_FORMAT,例如 BGRA 格式或高彩色格式,如 DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM (DXGI 1.1)。
    • 执行此操作时,请记住 RWTexture在 CS 5.0 配置文件中可用,因此仅兼容 DX11 的视频卡。
    猜你喜欢
    • 2010-12-28
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多