c++ 将单色OpenGL纹理保存到文件会生成一个64x64的黑框

r7xajy2e  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(142)

这个代码片段是为了创建一个单一颜色的GL纹理,然后将原始像素数据保存到磁盘。然后我使用ffmpeg将其转换为PNG。我尝试了多种生成纹理的方法,以及多种保存纹理数据的方法,但结果总是一样的--一张1920X1080的图像,角落里有一个64X64的黑盒子。我所期待的是一张单色的1920X1080图像。

我哪里做错了?
转换命令:

ffmpeg -pix_fmt rgba -s 1920x1080 -i texture.raw -f image2 output.png

代码:

gpu::gles2::GLES2Interface* gl = GetContextProvider()->ContextGL();
  GLuint texture;
  gl->GenTextures(1, &texture);
  gl->BindTexture(GL_TEXTURE_2D, texture);
  int width = 1920;
  int height = 1080;
  std::vector<unsigned char> data(width * height * 4, 0);
  for (size_t i = 2; i < data.size(); i += 4) {
      data[i] = 255; // blue channel
  }
  gl->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data.data());
  gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  std::vector<unsigned char> buffer(width * height * 4);
  gl->ReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
  std::ofstream file("texture.raw", std::ios::binary);
  file.write(reinterpret_cast<char*>(buffer.data()), buffer.size());
  file.close();
lf5gs5x2

lf5gs5x21#

请在此处查看主文档中对glReadPixels的描述:https://registry.khronos.org/OpenGL-Refpages/gl4/html/glReadPixels.xhtml.
本质上,glReadPixels是从当前帧缓冲区获取像素,* 而不是 * 从当前绑定的GL_TEXTURE_2D获取像素。如果没有更多的代码和上下文,我无法100%自信地回答。但看起来你的代码是在任何东西被渲染到帧缓冲区之前,你只是在设置东西。很可能您得到了一个黑盒,因为保存到缓冲区的数据无效。
希望能有所帮助。

相关问题