我想使用 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
但针对单个像素的东西?或者另一种上传稀疏像素的方法?
您必须取消像素数据的交错。 OpenGL(以及 Vulkan)无法上传像素交错数组层的数据。即使他们这样做了,最终也会归结为其他人必须进行非交错操作,因为硬件无法直接使用此类数据。