gpt4 book ai didi

c++ - 如何使用 OpenGL 加载 8 位 bmp?

转载 作者:行者123 更新时间:2023-11-27 23:22:17 25 4
gpt4 key购买 nike

这是我的情况:我需要预加载 2000 张图像并按顺序显示它们以成为 60 fps 的动画。目前,我正在使用 OpenGL 加载 bmp 文件,但由于内存限制,我最多只能预加载 500+ 图片。我怎么解决这个问题?到目前为止,我可以提出两个方向的解决方案:首先,也许我可以加载 8 位 bmp 图像以节省内存。但是我在使用 glDrawPixels 时遇到困难。其次,如果可能的话我可以直接加载jpeg吗?感谢您的任何建议!

不使用视频的原因是我需要通过跳过一张或多张图像来改变动画速度,正如您在代码中看到的那样(imgCount+=stp;//stp 表示要转义多少张图像。它可以制作视频快点)。在我的动画中,帧率很重要,低于 50 的 FPS 显示闪烁。

代码如下:

void Frame::LoadBMP(void){

FILE *in;


in=fopen(file,"rb");//open file
if(in==NULL){

exit(0);
}
fread(&(this->bmfh),sizeof(BITMAPFILEHEADER),1,in);//read bmp file header
fread(&(this->bmih),sizeof(BITMAPINFOHEADER),1,in);//read bmp infomation header

colours=new RGBQUAD[bmih.biBitCount];
fread(colours,sizeof(RGBQUAD),bmih.biBitCount,in);//read bmp colour table

size=bmfh.bfSize-bmfh.bfOffBits;
tempPixelData=new GLubyte[size];

if(tempPixelData==NULL) {
fclose(in);
}
fread(tempPixelData,sizeof(GLubyte),size,in);//read bmp image data
fclose(in);
}

然后我会显示图片序列,显示代码:

void display(void){

static clock_t start=clock();
static clock_t end=clock();

CurrtempPixelData=msFrame[offset]->tempPixelData;

glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);

glDrawPixels(frWidth, frHeight, GL_RGBA, GL_UNSIGNED_BYTE, msFrame[offset]->tempPixelData);

for(int i=0;i<m;i++){
clock_t c=clock();
}

glutSwapBuffers();
imgCount+=stp; // stp means how many images to escape. it can make video faster.
offset=imgCount%numFrame;
glutPostRedisplay();

}

最佳答案

你不应该使用 glDrawPixels,它是不推荐使用的功能。最好的方法可能是绘制一个屏幕大小的四边形(-1,-1 => 1,1,没有任何矩阵变换),您可以使用这些图像对其进行纹理处理。

对于纹理,您可以在 glTexImage2D 中指定几种内部格式和类似的功能。例如,您可以使用 GL_R3_G3_B2 格式来获取 8 位大小,但也可以使用像 S3TC 这样的压缩格式。 .例如,您可以传递 COMPRESSED_SRGB_S3TC_DXT1_EXT,这会将您的图像大小减小到每像素 4 位,可能比 8 位格式的质量更好。您不能在 OpenGL 中使用 JPEG 作为压缩格式(它太复杂了)。

最后,为什么要通过OpenGL来做呢?将图像 blitting 到常规窗口可能会给你足够好的性能。然后你甚至可以将你的图像序列存储为视频,然后只 blit 解码帧。在这种情况下,您不太可能遇到内存问题。

关于c++ - 如何使用 OpenGL 加载 8 位 bmp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11980790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com