Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用与OpenGL相关的库将纹理保存为图像文件?_Opengl_Glut_Freeglut - Fatal编程技术网

如何使用与OpenGL相关的库将纹理保存为图像文件?

如何使用与OpenGL相关的库将纹理保存为图像文件?,opengl,glut,freeglut,Opengl,Glut,Freeglut,我的代码的主要思想是绘制一个场景,提供纹理和几何模型。纹理由“.RAW”获得,几何模型由Delaunay三角剖分的一组三角形生成 现在,我可以在屏幕上打印结果,并将显示的结果保存为图像-“打印屏幕”。我正在使用freeglut制作它 问题是: 我使用的是高分辨率的输入图像。但是,输出图像将具有与我的屏幕相同的分辨率-1366x768(这与原始图像-8956x6708不同) 有人知道如何将我在屏幕上显示的纹理直接保存到文件中吗?不使用“打印屏幕”方法 我不认为我可以使用freeglut来处理这种情

我的代码的主要思想是绘制一个场景,提供纹理和几何模型。纹理由“.RAW”获得,几何模型由Delaunay三角剖分的一组三角形生成

现在,我可以在屏幕上打印结果,并将显示的结果保存为图像-“打印屏幕”。我正在使用freeglut制作它

问题是: 我使用的是高分辨率的输入图像。但是,输出图像将具有与我的屏幕相同的分辨率-1366x768(这与原始图像-8956x6708不同)

有人知道如何将我在屏幕上显示的纹理直接保存到文件中吗?不使用“打印屏幕”方法


我不认为我可以使用freeglut来处理这种情况。

这个答案是显示我如何读取图像(.raw),将其内容插入帧缓冲区对象并保存到.ppm文件中,而不使用“屏幕截图”。 因此,输出图像与输入图像具有相同的分辨率

我使用GLEW库来处理帧缓冲区对象

我希望它能帮助一些人

这是我的密码:

*(我删除了部分代码,只关注问题的主题。因此,有些变量没有意义!)

#包括
#定义GLEW_静态
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义宽度2464
#定义高度1648
///全局变量
静态胶合纹理;
GLuint fb=1///帧缓冲区对象
///标题
胶合原始纹理加载();
无效FBO_2_PPM_文件();
///功能
GLuint原始纹理加载()
{
胶合结构;
无符号字符*数据;
文件*文件;
//打开纹理数据
file=fopen(“C:\\Dataset\\1_4.raw”、“rb”);
如果(file==NULL)返回0;
//分配缓冲区
数据=(无符号字符*)malloc(宽度*高度*3);
//读取纹理数据
fread(数据,宽度*高度*3,1,文件);
fclose(文件);
glPixelStorei(GLU解包对齐,1);
///质地
//分配纹理名称
glGenTextures(1,&纹理);
//选择我们当前的纹理
glBindTexture(GL_TEXTURE_2D,纹理);
//选择“调制”将纹理与颜色混合以进行着色
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_贴花);
glTexParameteri(GL_纹理_2D、GL_纹理_最小过滤器、GL_贴花);
//当纹理区域较小时,双线性过滤最近的mipmap
glTexParameterf(GL\u纹理\u 2D、GL\u纹理\u最小\u过滤器、GL\u线性\u MIPMAP\u线性);
//当纹理区域较大时,双线性过滤第一个mipmap
glTexParameterf(GL_TEXTURE_2D、GL_TEXTURE_MAG_FILTER、GL_LINEAR);
//纹理应该是平铺的
glTexParameterf(GL_纹理2D、GL_纹理包裹S、GL_重复);
glTexParameterf(GL_纹理、GL_纹理、GL_包裹、GL_重复);
//构建纹理mipmapst
GLTEXAGE2D(GL_纹理_2D,0,GL_RGB,宽度,高度,0,GL_RGB,GL_无符号字节,数据);
//自由缓冲区
免费(数据);
返回纹理;
}
void render()
{
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glPushAttrib(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glEnable(GL_纹理_2D);
glTexEnvf(GL_纹理_环境、GL_纹理_环境模式、GL_贴花);
glBindTexture(GL_TEXTURE_2D,纹理);
glFlush();
glDisable(GL_纹理_2D);
///FBO
glGenFramebuffers(1和fb);
glBindFramebuffer(GL_FRAMEBUFFER,fb);
//将2D纹理附加到此FBO
glFramebufferTexture2D(GL_帧缓冲区,GL_颜色,GL_附件0,GL_纹理,GL_2D,纹理,0);
///将FBO(fb)的结果保存到PPM图像文件
FBO_2_PPM_文件();
}
void init()
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_平滑);
glEnable(德国劳埃德大学照明);
glEnable(GL_LIGHT0);
glEnable(GLU深度试验);
纹理=原始纹理加载();
render();
}
无效FBO_2_PPM_文件()
{
文件*输出图像;
int输出_宽度,输出_高度;
输出宽度=宽度;
输出高度=高度;
///从FBO读取像素值并保存到.PPM文件
int i,j,k;
无符号字符*像素=(无符号字符*)malloc(输出宽度*输出高度*3);
///阅读FBO的内容
glReadBuffer(GL_COLOR_ATTACHMENT0);
glReadPixels(0,0,输出宽度,输出高度,GL RGB,GL无符号字节,像素);
output_image=fopen(“C:\\Dataset\\output.ppm”,“wt”);
fprintf(输出图像,“P3\n”);
fprintf(输出图像,“#由Rico创建\n”);
fprintf(输出图像,“%d%d\n”、输出宽度、输出高度);
fprintf(输出图像,“255\n”);
k=0;

对于(i=0;i当您仅渲染到帧缓冲区时,此函数

void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *data);
将读取渲染的像素并将原始数据传递到该点(通常是指向无符号字符数组的指针)

您可以查看此文档以了解更多信息


很抱歉,对于保存文件,没有一个库可以保存所有格式,但我可以使用它来保存和加载png文件,在我看来,这种格式是最适合保存图形的格式。你可以查看它。

Freeglut与此无关。在GL中,你可以使用屏幕外帧缓冲区来渲染,当然你也可以阅读它返回并将其写入某个图像文件。8956x6708很容易得到现代GPU的支持,但即使您达到某个限制,您也可以进行平铺处理。感谢您的及时回复。我将进一步研究这一点,并尝试在“屏幕外帧缓冲区”(FBO)中呈现我的结果,对吗?我发现以下链接可能会有所帮助:和。