在c中读取OpenGL的jpg纹理

时间:2011-10-07 00:12:48

标签: c opengl

这是一个1024 x 512 jpg。
大小变量返回84793.
我不明白的一件事是当1024 * 512 = 524288时84793作为文件的大小。
我认为这将是* 3因为每个像素3个通道。
计数变量返回65.
当我设置OpenGL纹理参数时,我正在此行上获取访问冲突读取位置:

glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,texWidth,texHeight,0,GL_RGB,GL_UNSIGNED_BYTE,texPtr);

其中texWidth和texHeight的宽度和高度从下面。

这是我目前所拥有的:

int width = 1024;
int height = 512;
long size  = 0;
GLubyte * data;
FILE * file;
char name[100];
int count;

int test;

strcpy(name, filename);
// open texture data
file = fopen( name, "r" );
if ( file == NULL )
{
fputs ("File error",stderr); 
exit (1);
 }
 fseek (file , 0 , SEEK_END);
 size = ftell( file );
 rewind(file);
// allocate buffer
data = (unsigned char *)malloc( sizeof(char)*size );

count = (int) fread (data,sizeof(unsigned char) ,size,file);
fclose( file );

// allocate a texture name
glGenTextures( 1, &dayGLTexture );

initTexture(dayGLTexture, width, height, data);

2 个答案:

答案 0 :(得分:6)

OpenGL不处理JPEG压缩,也不处理JPEG图像文件格式。你不能只是在磁盘上取一个文件,将它放入内存并将其交给OpenGL。您必须阅读文件格式,将其处理为OpenGL实际可以读取的格式,然后将其提供给OpenGL。

对于各种不同的图像格式,您可以使用a number of libraries来执行此操作。您还应该阅读how OpenGL understands the pixel data you give it,并了解internal image format parameter的含义。

答案 1 :(得分:2)

您无法直接将图像文件直接传递给OpenGL。图像文件是容器。它们包含的数据必须首先解压缩并解码。有些文件格式可能包含OpenGL(平面数据)可直接消化的形式的数据,其中包括TGA和BMP。

但是你应该从不直接将文件数据传递给某些API(除非您正在构建文件传输或复制程序)。

读取图像文件始终需要执行以下步骤:

  • 读取和解释元数据(标题,尾部或两者)。
  • 根据元数据信息准备中间缓冲区和读取/解码过程。
  • 从文件中读取数据并对其进行解码(对于平面文件,这可能仍需要一些字段调整,位掩码和颜色校正)。必须首先解压缩压缩数据。 JPEG是一种有损压缩方案
  • 将数据传递给OpenGL,或者将其保存在缓冲区中供以后使用。