如何使用 glGetTexImage 将数据从立方体贴图读取到 OpenGL 中的 CPU?

Hen*_*nkk 5 opengl

我无法将立方体贴图读回 CPU。当我在glTexImage2D调用中将数据传递给立方体贴图时,可以毫无问题地读回这些数据。但是当我渲染到立方体贴图时,只有立方体贴图的正 x 侧包含合理的数据。其他一切都是 0(而不是未初始化)。

我正在使用分层渲染渲染到立方体贴图,然后通过在着色器中对其进行采样来检查立方体贴图的内容。我在那里得到的是正确的。但glGetTexImage似乎不像我想象的那样工作。

当我glGetTexImage按照以下建议调用时,没有绑定帧缓冲区:www.gamedev.com

我这样做错了吗?有人知道这里可能出了什么问题吗?

glGenTextures(1, &c_cubemap);
glBindTexture(GL_TEXTURE_CUBE_MAP, c_cubemap);

// load data ...

auto width = positiveX->width;
auto height = positiveX->height;
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB16F, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, ...);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB16F, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, ...);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB16F, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, ...);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB16F, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, ...);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB16F, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, ...);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB16F, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, ...);

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_REPEAT);

// Here, the rendering takes place.

auto size = width * height * 3;
auto bufferPositiveX = new float[size];
auto bufferNegativeX = new float[size];
auto bufferPositiveY = new float[size];
auto bufferNegativeY = new float[size];
auto bufferPositiveZ = new float[size];
auto bufferNegativeZ = new float[size];

glBindTexture(GL_TEXTURE_CUBE_MAP, c_cubemap);
glGetTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, GL_FLOAT, bufferPositiveX);
glGetTexImage(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGB, GL_FLOAT, bufferNegativeX);
glGetTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGB, GL_FLOAT, bufferPositiveY);
glGetTexImage(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGB, GL_FLOAT, bufferNegativeY);
glGetTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGB, GL_FLOAT, bufferPositiveZ);
glGetTexImage(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGB, GL_FLOAT, bufferNegativeZ);
glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
Run Code Online (Sandbox Code Playgroud)

我正在使用NVIDIA GeForce GTX 780。驱动程序版本是364.72

bof*_*jas 2

我在这里找到了答案: https ://www.opengl.org/sdk/docs/man/html/glGetTexImage.xhtml

它说:“如果对立方体贴图纹理对象使用 glGetTextureImage,则该纹理将被视为深度为 6 的三维图像,其中立方体贴图面按图像层排序,顺序如下表所示:”

Layer number    Cube Map Face
0               GL_TEXTURE_CUBE_MAP_POSITIVE_X
1               GL_TEXTURE_CUBE_MAP_NEGATIVE_X
2               GL_TEXTURE_CUBE_MAP_POSITIVE_Y
3               GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
4               GL_TEXTURE_CUBE_MAP_POSITIVE_Z
5               GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
Run Code Online (Sandbox Code Playgroud)

  • 当 GL_TEXTURE_CUBE_MAP 与 glGetTexImage 一起使用时,OpenGL 会生成 INVALID_ENUM 错误。不支持 GL_TEXTURE_CUBE_MAP 作为 glGetTexImage 的目标。只有GL_TEXTURE_CUBE_MAP_POSITIVE_X、GL_TEXTURE_CUBE_MAP_NEGATIVE_X等。但它们会导致所描述的行为。我什至在不同的位置重现了这种行为。 (2认同)
  • @Henkk:听起来像是一个驱动程序错误。 (2认同)