2012-10-23 62 views
2

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

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

回答

1

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

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

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

    的一维或二维层状纹理(也称为在Direct3D纹理阵列和在OpenGL阵列纹理)是由层的序列的纹理,所有这些都是具有相同维度,大小和数据类型的常规纹理。

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

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

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

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

  3. 你可以考虑一种混合的方法:纹理成大小相同的组进行排序和使用分层纹理每个组。或者使用分层纹理图集,其中组包装使得每个图层包含来自每个组的一个或几个纹理以最小化浪费。

关于你身边的问题:一个google search for "cuda jpeg decode" turns up a lot of results,包括at least one open source project

+0

令人印象深刻的快!然而,我面对不同大小的图像,我虽然排除使用分层纹理? – sedona2222

+0

然后再次,也许我可以设置分层纹理到最大的图像,并发送各种尺寸以及...... – sedona2222

+0

我意识到这一限制,但没有其他*内置*的方式在CUDA批量上传2D纹理数据,除了分层或3D纹理。我编辑了我的答案,添加了另一个选项“纹理地图集”。 – harrism