这个代码片段是为了创建一个单一颜色的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();
1条答案
按热度按时间lf5gs5x21#
请在此处查看主文档中对
glReadPixels
的描述:https://registry.khronos.org/OpenGL-Refpages/gl4/html/glReadPixels.xhtml.本质上,
glReadPixels
是从当前帧缓冲区获取像素,* 而不是 * 从当前绑定的GL_TEXTURE_2D
获取像素。如果没有更多的代码和上下文,我无法100%自信地回答。但看起来你的代码是在任何东西被渲染到帧缓冲区之前,你只是在设置东西。很可能您得到了一个黑盒,因为保存到缓冲区的数据无效。希望能有所帮助。