我使用 .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 );
}
答案 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格式时,这会越来越复杂。
其他并发症将是:
答案 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