0

我使用 glTexSubImage2D 和 GL_TEXTURE_CUBE_MAP 作为目标。如果高度和宽度不相同,它会在我的驱动程序上给我 GL_INVALID_VALUE 。我不确定这种类型的驱动程序行为。据我所知,Khronos.org 上的 glTexSubImage2D 手册页中没有提到它。有没有人遇到过这个?

以下是后续调用: glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X,0,*internal_format,*width,*height,0,GL_BGRA,*type,color); glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X,0,*internal_format,*width,*height,0,GL_BGRA,*type,color); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y,0,*internal_format,*width,*height,0,GL_BGRA,*type,color); glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,0,*internal_format,*width,*height,0,GL_BGRA,*type,color); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z,0,*internal_format,*width,*height,0,GL_BGRA,*type,color); glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,0,*internal_format,*width,*height,0,GL_BGRA,*type,color); glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X,0,*x_offset,*y_offset,*sub_width,*sub_height,GL_BGRA,*type,color+10); glTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X,0,*x_offset,*y_offset, *sub_width,*sub_height,GL_BGRA,*type,color+10); glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y,0,*x_offset,*y_offset,*sub_width,*sub_height,GL_BGRA,*type,color+10); glTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,0,*x_offset,*y_offset,*sub_width,*sub_height,GL_BGRA,*type,color+10); glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z,0,*x_offset,*y_offset,*sub_width,*sub_height,GL_BGRA,*type,color+10); glTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,0,*x_offset,*y_offset,*sub_width,*sub_height,GL_BGRA,*type,color+10); glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z,0,*x_offset,*y_offset,*sub_width,*sub_height,GL_BGRA,*type,color+10); glTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,0,*x_offset,*y_offset,*sub_width,*sub_height,GL_BGRA,*type,color+10); glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z,0,*x_offset,*y_offset,*sub_width,*sub_height,GL_BGRA,*type,color+10); glTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,0,*x_offset,*y_offset,*sub_width,*sub_height,GL_BGRA,*type,color+10);

where 
name="target" value="GL_TEXTURE_CUBE_MAP"
 name="width" value="8"
 name="height" value="8"
 name="internal_format" value="GL_RG8_SNORM"
 name="x_offset" value="4"
 name="y_offset" value="4"
 name="sub_width" value="2"
 name="sub_height" value="4"
 name="type" value="GL_UNSIGNED_INT_8_8_8_8"
4

1 回答 1

0

这是意料之中的,问题是这GL_TEXTURE_CUBE_MAP实际上只是一种简单的数组纹理形式。当您使用将纹理图像上传到立方体贴图时,glTexSubImage2D (...)您必须指出哪个面(实际上是它的数组索引)。

立方体贴图的有效面(目标)是:

  • GL_TEXTURE_CUBE_MAP_POSITIVE_X
  • GL_TEXTURE_CUBE_MAP_POSITIVE_Y
  • GL_TEXTURE_CUBE_MAP_POSITIVE_Z
  • GL_TEXTURE_CUBE_MAP_NEGATIVE_X
  • GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
  • GL_TEXTURE_CUBE_MAP_NEGATIVE_Z

根据OpenGL规范:

与只有一个目标的标准 1D、2D 或 3D 纹理不同,立方体贴图纹理有六个目标,每个目标对应其六个 2D 纹理图像立方体面。所有这些目标必须一致、完整,并且具有相等的宽度和高度(即正方形尺寸)。

但是,在这种情况下,问题是您的目标而不是您的尺寸。您可以上传您想要的纹理图像的任何子区域,此操作不必是正方形。

也就是说,在这种情况下,它应该加注GL_INVALID_ENUM而不是加注GL_INVALID_VALUE。假设您确实在使用GL_TEXTURE_CUBE_MAP而不是上面列出的 6 个面部枚举之一,那么我倾向于认为这是一个驱动程序错误。我需要查看您传递给的每个参数glTexSubImage2D (...)以及您最初用于创建图像数据存储的调用,以便确定。

于 2013-08-28T06:54:44.880 回答