如何高效上传转置数据到GL_TEXTURE_2D_ARRAY

问题描述 投票:0回答:1

我想使用 GL_TEXTURE_2D_ARRAY 来保存 OpenGL ES 3.0 中的纹理。我正在阅读 OpenGL wiki 的数组纹理,它有一个数据示例,该数据按第一个图像的所有像素排序,然后是第二个图像的所有像素排序。

GLubyte texels[32] = 
{
     // Texels for first image.
     0,   0,   0,   255,
     255, 0,   0,   255,
     0,   255, 0,   255,
     0,   0,   255, 255,
     // Texels for second image.
     255, 255, 255, 255,
     255, 255,   0, 255,
     0,   255, 255, 255,
     255, 0,   255, 255,
};

但是,我的数据按第一张图像的第一个像素、第二张图像的第一个像素、第一张图像的第二个像素、第二张图像的第二个像素等排序。 如果我们使用与上面相同的图像,数据将如下所示:

GLubyte texels[32] = 
{
     0,   0,   0,   255, // 1st pixel of first image
     255, 255, 255, 255, // 1st pixel of second image
     255, 0,   0,   255, // 2nd pixel of first image
     255, 255,   0, 255, // 2nd pixel of second image
     0,   255, 0,   255, // 3rd pixel of first image
     0,   255, 255, 255, // 3rd pixel of second image
     0,   0,   255, 255, // 4th pixel of first image
     255, 0,   255, 255, // 4th pixel of second image    
};

默认数据排列在

data[image_num][width][height]
,但我的数据是
data[width][height][image_num]
。因为数据很大并且正在流式传输,所以我宁愿不必在 CPU 上重新排序数据。

我尝试使用多个

glTexSubimage3D()
分别上传每个图像。但是,为了使其正常工作,我需要 OpenGL 上传在上传每个像素后跳过
(num_layers-1)*4
字节。我查看了
glPixelStore()
参数,并看到了
GL_UNPACK_ROW_LENGTH
参数,但这不起作用,因为它在读取整行像素后跳过,并且我需要它在每个像素后跳过 X 个字节。有没有类似于
GL_UNPACK_ROW_LENGTH
GL_UNPACK_IMAGE_HEIGHT
但针对单个像素的东西?或者另一种上传稀疏像素的方法?

c opengl-es glsl textures
1个回答
0
投票

您必须取消像素数据的交错。 OpenGL(以及 Vulkan)无法上传像素交错数组层的数据。即使他们这样做了,最终也会归结为其他人必须进行非交错操作,因为硬件无法直接使用此类数据。

© www.soinside.com 2019 - 2024. All rights reserved.