批量纹理上传

时间:2012-10-23 22:22:03

标签: cuda jpeg textures

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

      

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

         

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

         

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

         

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

         

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

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

  4. 关于您的附带问题:google search for "cuda jpeg decode" turns up a lot of results,包括at least one open source project