opengl高纹理vs内存局部性的宽纹理

时间:2017-12-07 07:07:22

标签: opengl multidimensional-array textures

2D纹理有两个坐标,x和y。要在一维存储器中存储二维数组,两种可能的格式是[x + y * width]和[x * height + y]。 OpenGL有各种令人困惑的行主/列主要约定,所以我不确定它使用哪两种格式。这是相关的,因为如果纹理用于存储多个图像,例如在精灵表或图集中,最好将图像的各部分放在一起靠近存储器。例如,如果格式是[x + y * width]并且我们使用的是非常宽的纹理,那么GPU将不得不跳过内存的长部分来查找所需的纹素。

因此:是一个高质感的地图集,优于宽幅纹理图集,还是相反?或者GPU没有内存位置的好处?

1 个答案:

答案 0 :(得分:2)

纹理图集最重要的方面是可以在其中放置多少图像。即使是纹理地图集,您也更有可能访问相邻的纹素而不是远处的纹素。

想一想。假设您渲染2个32x32精灵。所以这是2个四边形,在一个渲染调用中。每个四边形将在屏幕上占用32x32像素;这是1024像素。

地方很重要;您将从1024个本地相邻的纹素进行渲染,然后从1024个本地相邻纹素的不同集合进行渲染。

在任何情况下,OpenGL都不会让您了解GPU图像格式的详细信息。您可以要求特定尺寸的纹理元素和多个频道。但是你没有得到更多细节。您提供的数据将由驱动程序适当地转换为实际的内部GPU数据。

通常,GPU会在内存中调配纹理。这意味着重新排列数据以便保留位置。也就是说,不是将纹素存储为x + y * widthx * height + y,而是以更复杂的方式存储它们。

例如,前4个值为纹素0,0; 0,1; 1,0;和1,1。因此,2x2块纹素存储在单个连续的内存阵列中。这是混合纹理存储如何工作的一个例子。

但这都是一个实施细节;没有什么可以影响或影响这一点,甚至像Vulkan这样的低级API也不允许你直接加载预先调整的纹素数据。