我知道GPU上的纹理缓存可以优化2D(如果使用3D纹理,则为3D)的局部性。我相信这是使用Morton或Hilbert曲线等空间填充曲线完成的。

将纹理数据数组传递给GPU时,例如,使用glTextureSubImage2D时,数据以扫描线顺序指定。

那么,如何以及何时进行转换发生了吗?我可以想到几个可能性:


纹理在VRAM中线性布置,并且纹理单元
在加载到缓存时将事务合并到不同的区域。
纹理传递到GPU时会变得模糊不清,并以Morton编码的顺序(或其他空间填充曲线)存储在VRAM中。

那是什么,或者还有另一种可能性已经错过了吗?如果是选项2,如果您已经在CPU端使用了莫顿编码的版本,是否可以通过选项传递“ verbatim”纹理?还是要在加载到GPU之前取消转换?

#1 楼

与其他许多隐式操作一样,在vulkan中,此转换是显式的。图像可以采用以下两种平铺布局之一:最佳和线性。线性图像具有固定的布局,而最佳图像具有实现定义的空间填充曲线。 (当前无法确定使用了哪个精确曲线)。

要填充最佳平铺的图像,您需要从另一幅图像或从vkBuffer(具有线性格式的数据)中复制。伪装作为副本的一部分完成。但要求操作期间不得更改数据源。因为允许从复制操作的源读取其他操作。

评论


$ \ begingroup $
太酷了。这几天我需要尝试一下Vulkan,当它问世时我对其进行了查看,但被1000行hello三角程序吓了一跳!
$ \ endgroup $
– russ
17年11月21日在12:21

$ \ begingroup $
TBH的这1000条线路中,大多数忙于填写以下结构:80%的时间不需要更改,但其余20%的位置可以保持良好的状态。一旦您了解了api的一般体系结构并可以确定每个结构为何重要的原因,那就没那么可怕了。
$ \ endgroup $
–棘轮怪胎
17年11月21日在12:25

#2 楼

可能是“以上所有”。

我与同一供应商的硬件的不同世代合作,这些硬件具有各种要求的软件(API /驱动程序或纹理工具)来将纹理数据预排序为Morton /平铺布局,我认为还有其他一些具有更多“内置”处理功能的计算机。