【发布时间】: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 等价物。我不知道如何编写该代码,但您可能想研究一下。 -
要从着色器写入像素数据,您需要将纹理绑定为渲染目标。