2

我有一个专门的渲染应用程序,需要从 pdf 加载任意数量的 jpeg,然后将图像写到内核内的渲染页面中。这过于简单了,但关键是我想找到一种方法将“n”个图像作为纹理共同发送,然后在内核中为 tex2d() 调用索引到这个纹理集合。欢迎任何想法优雅地做到这一点。

作为一个附带问题,我还没有找到一种方法来解码内核中的 jpeg 图像,迫使我在 CPU 上解码,然后(慢慢地)发送一个大位图。我可以改进吗?

4

1 回答 1

1

第一:如果纹理上传性能不是瓶颈,请考虑不要批量上传。这里有一些建议,每一个都有不同的权衡。

  1. 对于不同大小的纹理,请考虑创建纹理图集。这是一种在游戏开发中流行的技术,它将许多纹理打包到一个 2D 图像中。这需要将纹理坐标偏移到相关图像的角落,并且排除了使用纹理坐标钳制和环绕。因此,您需要存储每个子纹理角的偏移量而不是其 ID。有多种工具可用于创建纹理图集。

  2. 对于固定大小的纹理,或者您不介意浪费不同大小的纹理的情况,您可以考虑使用分层纹理。这是一个具有多个独立层的纹理,可以在纹理提取时使用单独的层索引对其进行索引。从上面的链接引用:

    一维或二维分层纹理(在 Direct3D 中也称为纹理数组,在 OpenGL 中也称为数组纹理)是由一系列层组成的纹理,所有层都是具有相同维度、大小和数据类型的常规纹理.

    使用整数索引和浮点纹理坐标来寻址一维分层纹理;索引表示序列中的层,坐标表示该层中的纹素。使用整数索引和两个浮点纹理坐标来寻址二维分层纹理;索引表示序列中的层,坐标表示该层中的纹素。

    分层纹理只能是一个 CUDA 数组,方法是使用 cudaArrayLayered 标志调用 cudaMalloc3DArray()(一维分层纹理的高度为零)。

    使用 tex1Dlayered() 和 tex2Dlayered() 中描述的设备函数获取分层纹理。纹理过滤(请参阅纹理提取)仅在层内完成,而不是跨层。

    分层纹理仅在计算能力 2.0 及更高版本的设备上受支持。

  3. 您可以考虑一种混合方法:将纹理分类为相同大小的组,并为每个组使用分层纹理。或者使用分层纹理图集,其中组被打包,使得每层包含来自每个组的一个或几个纹理,以最大程度地减少浪费。

关于你的附带问题:谷歌搜索“cuda jpeg decode”会出现很多结果,包括至少一个开源项目

于 2012-10-23T22:35:50.763 回答