【问题标题】:How can I define an array with a large dimension in HLSL?如何在 HLSL 中定义一个大维度的数组?
【发布时间】:2017-11-20 03:13:00
【问题描述】:

有没有办法在 HLSL 中定义一个大数组或任何替代方法,因为我正试图将我的一些计算转移到 GPU。

我现在有

struct Buffer
{
    float3 image[640 * 480];   
};

但我得到了错误

error X3059: array dimension must be between 1 and 65536

如果我不必将其拆分然后将它们重新合并到 CPU 上,那就太好了。

有没有办法解决这个问题?

更新

正如 cmets 中所述,将这些数据存储为纹理会更有意义,因为我尝试创建的数组存储像素数据。我试图在 HLSL 文件中定义我的Texture2D,但我似乎无法编辑数据或写入纹理文件。

有人知道怎么做吗?

【问题讨论】:

  • 我对 DirectX/HLSL 了解不多,但是在 OpenGL 中,Uniform Buffers(这似乎是一种类似物)对它们的存储容量有类似的限制,通常建议您使用纹理作为替代存储(这似乎很合适,因为这似乎是一个代表图像的对象),或者使用 Shader Storage Buffer,它可以具有更大的大小。我不知道着色器存储缓冲区的 DX 版本是什么。
  • @Xirema 会更有意义。我刚刚尝试使用 Texture2D,但似乎无法从着色器中修改像素数据。也许我错过了什么。
  • 好吧,在 OpenGL 中,如果您想要对缓冲区进行读写访问,则需要使用 Shader Storage Buffers,而 Uniform Buffers 往往是只读的,并且纹理只能在作为对象提供给着色器时读取,并且只能作为片段(像素,在 HLSL 中)着色器的正常输出的一部分写入,前提是您将自定义帧缓冲区与纹理附件绑定。任何一种解决方案都应该在 HLSL 中具有等效项。
  • 我做了一点挖掘,听起来RWBuffers 是 HLSL 等价物。我不知道如何编写该代码,但您可能想研究一下。
  • 要从着色器写入像素数据,您需要将纹理绑定为渲染目标。

标签: c++ directx hlsl


【解决方案1】:

我找不到解决方案,但是当我处理图像数据时,使用 RWTexture2D<float4> 并提供读写访问权限似乎可以很好地实现我想要实现的目标。

【讨论】:

    猜你喜欢
    • 2013-04-11
    • 1970-01-01
    • 2022-01-16
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 2013-06-20
    • 1970-01-01
    相关资源
    最近更新 更多