将大纹理传递给 GLSL 着色器?

Passing a big texture to a GLSL shader?

提问人:Fabalo Asdimov 提问时间:4/15/2023 最后编辑:genpfaultFabalo Asdimov 更新时间:4/15/2023 访问量:133

问:

我需要将两个 65536x1024 像素的纹理传递给着色器程序。我无法通过标准方法执行此操作,因为 OpenGL 端对纹理的高度和宽度有限制(此值存储到常量中)。我正在考虑使用 将每个纹理拆分为子纹理,但据我了解,这样做也可能很困难。有没有办法将这些纹理传递给着色器?glTexImage2D()GL_MAX_TEXTURE_SIZEglTexImage3D(GL_TEXTURE_2D_ARRAY, ...)

opengl glsl opengl-3 opengl-4

评论

1赞 Yakov Galka 4/15/2023
“但据我所知,这也很困难”——你能详细说明一下吗?你尝试了什么,为什么很难?根本没有办法创建大于实现限制的 2D 纹理(这就是“限制”的含义)。稀疏虚拟纹理可以有更大的限制,但它们不在核心中,也不保证支持该大小。您可以将数据打包到 SSBO 中(支持的最小大小为 128MB),但随后按照您的建议打包到纹理数组中或将图块拆分为方形 2d 纹理也同样有效。
0赞 Yakov Galka 4/15/2023
我宁愿看看为什么你需要这么大的纹理,然后重写你的着色器,这样它只需要纹理的一小部分。在磁贴中处理大图像是相当常见的。
0赞 user253751 4/17/2023
65536x1024 似乎应该在具有许多 GB 内存的现代显卡范围内。请注意,常量不是最大纹理大小,而是一个数字,表示“请告诉我最大纹理大小”。要获得最大纹理大小,您应该调用并说GL_MAX_TEXTURE_SIZE是您想要获得的东西。GL_MAX_TEXTURE_SIZEglGetIntegerv
0赞 Yakov Galka 4/23/2023
纹理大小限制@user253751纹理过滤单元施加的,而不是由可用内存施加的。截至今天,16384 是最广泛支持的限制,并且似乎没有 GPU 支持大小大于 32768 的纹理。请参阅 opengl.gpuinfo.org/...

答: 暂无答案