纹理加载和映射

时间:2016-04-29 11:38:02

标签: c++ opengl

我使用 .bmp 格式图像构建了一个球体。问题是,当图像映射到球体上时,图像的颜色看起来是反转的。就像RED变成蓝色而蓝色变成红色。 我尝试使用 GL_BGR 而不是 GL_RGB ,但没有用。 我是否必须更改加载图像的代码。因为它会产生使用 fopen()功能的警告,而且我也不认为它与我所要求的相关。 映射后我得到的图像是texured sphere with inverted colors

这是我尝试加载图像并应用了一些纹理渲染的东西。

   GLuint LoadTexture( const char * filename, int width, int height )
{
GLuint texture;
unsigned char * data;
FILE * file;

//The following code will read in our RAW file
file = fopen( filename, "rb" );
if ( file == NULL ) return 0;
data = (unsigned char *)malloc( width * height * 3 );
fread( data, width * height * 3, 1, file );
fclose( file );

glGenTextures( 1, &texture ); //generate the texturewith the loaded data
glBindTexture( GL_TEXTURE_2D, texture ); //bind thetexture to it’s array
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE ); //set        texture environment parameters




// better quality
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR );

//Here we are setting the parameter to repeat the textureinstead of clamping the texture
//to the edge of our shape.
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_REPEAT );   
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT );

//Generate the texture with mipmaps
gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width, height,GL_RGB, GL_UNSIGNED_BYTE, data );
free( data ); //free the texture
return texture; //return whether it was successfull
}

   void FreeTexture( GLuint texture )
   {
    glDeleteTextures( 1, &texture );
   }

2 个答案:

答案 0 :(得分:0)

BMP文件以BITMAPFILEHEADER结构开头,该结构包含(除其他外)文件中实际起始位置的偏移量。

所以你可以做这样的事情来获取BMP文件的各个部分。

BITMAPFILEHEADER bmpFileHeader;
fread(&bmpFileHeader,sizeof(bmpFileHeader),1,file);
fsetpos(file,bmpFileHeader->bfOffBits,SEEK_SET);
size_t bufferSize = width * height * 3;
fread(data,bufferSize,1,file);

当然,这是危险的,因为您期望大小合适且格式化的BMP文件。所以你真的需要阅读BITMAPINFO。

BITMAPFILEHEADER bmpFileHeader;
fread(&bmpFileHeader,sizeof(bmpFileHeader),1,file);
BITMAPINFO bmpInfo;
fread(&bmpInfo,sizeof(bmpInfo),1,file)
fsetpos(file,bmpFileHeader->bfOffBits,SEEK_SET);
int width = bmpInfo->bmiHeader.biWidth;
int height = bmpInfo->bmiHeader.biHeight;
assert(bmpInfo->bmiHeader.biCompression == BI_RGB);
assert(bmpInfo->bmiHeader.biBitCount == 24;
size_t bufferSize = width * height * 3;
fread(data,bufferSize,1,file);

显然,在将bmp格式映射到允许的opengl格式时,这会越来越复杂。

其他并发症将是:

  • bmp数据是自下而上的,所以除非你纠正,否则会出现倒挂。
  • bmp文件中的像素数据被填充以确保每行是4字节宽的倍数,如果您的图像不是每像素32位,或者是4像素宽的倍数,则可能导致步幅问题(这是练习是通常是真的)。​​
  • 仅仅因为您可以向OpenGL提供常量并不意味着实际支持该格式。有时你只需要进入那里并自己重新订购字节。

答案 1 :(得分:0)

最后我得到了我需要的东西。我使用了错误的参数 GL_RGB ,而是在此函数中将 GL_BRG_EXT 替换为

gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width, height,GL_BGR_EXT, GL_UNSIGNED_BYTE, data ); 

之前我得到了这个。textured mapped sphere with inverted colors

现在我在上面所做的改变之后得到了这个。textured mapped sphere with true colors