如何将部分纹理复制到opengl中的图像

Posted

技术标签:

【中文标题】如何将部分纹理复制到opengl中的图像【英文标题】:How to copy part of texture to an image in opengl 【发布时间】:2015-08-09 13:03:48 【问题描述】:

我正在使用 opengl 开发一个项目。 我在填充有 bmp 图像文件的多边形中有一个多边形。 我可以旋转相机从不同的地方查看图像,我想复制图像的一部分并将其放入一个新的 bmp 文件中。 我有很多不必要的代码,所以我将复制重要的部分。

_textureId = LoadBMP("file.bmp");


glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, _textureId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glColor3f(1, 1, 0.7);
float BOX_SIZE = -12.0f;
glBegin(GL_QUADS);
glVertex3f(-BOX_SIZE / 2, -BOX_SIZE / 2, -5);
glVertex3f(BOX_SIZE / 2, -BOX_SIZE / 2, -5);
glVertex3f(BOX_SIZE / 2, -BOX_SIZE / 2, 5);
glVertex3f(-BOX_SIZE / 2, -BOX_SIZE / 2, 5);


glEnd();

而且轮换非常基本,所以有人有什么建议吗? 非常感谢。

【问题讨论】:

【参考方案1】:

如果要将 OpenGL 的输出保存到文件中,则必须将颜色缓冲区的内容从 GL 读回客户端内存。然后,您可以为所欲为。命令

glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *data)

将从x,y 开始的width * height 像素的矩形中的像素数据读回到位于data 的内存缓冲区。由于您说要将其保存为 BMP 文件,因此您可能希望 GL_UNSIGNED_BYTE 作为类型,因为 BMP 最多仅支持每个通道 8 位。您可能还希望 GL_BGAGL_BGR 作为格式,因为这是 BMP 的本机通道布局。

【讨论】:

感谢您的快速回答。但是我以什么格式保存数据?是 char** 还是什么?对我的知识感到抱歉,但我对这个主题真的很陌生。 好吧。如果要将其保存为 BMP,则可能应该使用某种图像库。 Windows 本身也应该能够生成 BMP 文件。基本上,您将需要一个挂件到您的 LoadBitmap 函数。

以上是关于如何将部分纹理复制到opengl中的图像的主要内容,如果未能解决你的问题,请参考以下文章

openGL FBO 复制到纹理导致黑色/深色图像

[转]OpenGL 使用 PBO 高速复制屏幕图像到内存或者纹理中

将绑定到 FBO 的纹理复制到另一个 OpenGL 上下文

渲染到纹理 OpenGL ES 2.0

将opengl主帧缓冲区复制到fbo

使用 FBO 和着色器 OpenGL 渲染到纹理