opengl 如何正确对齐奇数行像素宽度的NPOT纹理?

pcww981p  于 2023-01-13  发布在  其他
关注(0)|答案(1)|浏览(191)

我使用存储在.cube文件中的LUT文件进行图像后期处理。
LUT.cube文件布局可能如下所示:

TITLE
LUT_3D_SIZE 2
    
1.000000 1.000000 1.000000 -> takes black pix. from input image and transfers to white output pix
1.000000 0.000000 0.000000
0.000000 1.000000 0.000000
0.000000 0.000000 1.000000
1.000000 1.000000 0.000000
1.000000 0.000000 1.000000
0.000000 1.000000 1.000000
0.000000 0.000000 0.000000 -> takes white pix. from input image and transfers to black output pix.

我从文件中加载原始数据到数据向量(这部分是100%正确的),然后加载它的数据到GL_TEXTURE_3D,并使用它调用glActiveTexture(GL_TEXTURE0_ARB + unit);作为sampler3D在frag。着色器利用GLSL texture(...)函数自由插值。

glGenTextures(1, &texID);
  glBindTexture(GL_TEXTURE_3D, texID);

  constexpr int MIPMAP_LEVEL = 0;  // I do not need any mipmapping for now.

  //glPixelStorei(GL_UNPACK_ALIGNMENT, 1); -> should I use this???

  glTexImage3D(
    GL_TEXTURE_3D,
    MIPMAP_LEVEL,
    GL_RGB,
    size.x,  // Size of the LUT 2, 33 etc., x == y == z.
    size.y,
    size.z,
    0,
    GL_RGB,
    GL_FLOAT,  // I assume this is correct regarding how are stored the data in the LUT .cube file.
    data
  );

  glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, MIPMAP_LEVEL);

  glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

  glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);

  glBindTexture(GL_TEXTURE_3D, 0);

简单地说,输入图像被限制为 * RGB 8 * 或 * RGB 16 * 格式。
LUT_3D_SIZE为2时(我想任何POT都可以),这可以正常工作,产生预期的恒定颜色转换输出。
然而,这些LUT文件可能具有NPOT大小的LUT_3D_SIZE参数-奇数,如33,这是我开始出现问题和非确定性输出的地方(输出纹理在每次后处理运行时都在变化-我认为这是因为 * 非对齐 * 纹理填充了一些随机数据)。
我应该如何解决这个问题?

  • 我想我可以使用glPixelStorei(GL_PACK/UNPACK_ALIGNMENT, x);来补偿奇数像素行宽(33),但我想了解(数学)是怎么回事,而不是试图拿起一些随机对齐,将神奇地为我工作。此外,我不确定这是否是我面临的真实的问题,所以... *

为了澄清我在桌面GL 3.3+可用,英伟达卡.

ne5o7dgx

ne5o7dgx1#

长话短说:问题是在代码的其余部分中的某个地方将GL_UNPACK_ALIGNMENT设置为8(使用glGetIntegerv(GL_UNPACK_ALIGNMENT, &align)查找),这不可能划分实际的行字节大小以获得整数,因此纹理是畸形的。
由于实际行字节大小为33 * 33 * 12(宽度 * 深度 *(GL_FLOAT)的大小 * 3(RGB))= 13068,其可被1整除,2也是4(所以所有这些可能性必须是有效的,如果使用的图像加载器)这是揭示在最后,它的作品为所有这些设置,我一定错过了一些东西(或者忘记重新编译或当我遇到GL_UNPACK_ALIGNMENT设置为1的问题时,因为它是有效的选项,现在我感觉它工作正常-值2和4也是如此)。

相关问题