2010-11-04 175 views
3

這些爲什麼不顯示相同的顏色?OpenGL用不同於原始圖像的顏色渲染紋理?

原始圖像:

alt text

平面含上面的圖像作爲紋理: alt text

WTF正在發生? 原始圖像是100x100像素,用油漆製作並保存爲24位位圖。 這裏是我的OpenGL的初始化代碼:

_hdc = GetDC(_hwnd); 

PIXELFORMATDESCRIPTOR pfd; 
ZeroMemory(&pfd, sizeof(pfd)); 
pfd.nSize = sizeof(pfd); 
pfd.nVersion = 1; 
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; 
pfd.iPixelType = PFD_TYPE_RGBA; 
pfd.cColorBits = 24; 
pfd.cDepthBits = 16; 
pfd.iLayerType = PFD_MAIN_PLANE; 
int iFormat = ChoosePixelFormat(_hdc, &pfd); 
SetPixelFormat(_hdc, iFormat, &pfd); 

_hrc = wglCreateContext(_hdc); 
wglMakeCurrent(_hdc, _hrc); 

GLHelper* helper = GLHelper::get(); 
helper->initialize(_hwnd, _hdc, _hrc); 
changeScreenResolution(_settings.windowWidth, _settings.windowHeight, 
    _settings.sceneWidth, _settings.sceneHeight); 

// Initialize OpenGL Settings 
glShadeModel(GL_SMOOTH); // Enable Smooth Shading 
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background 
glClearDepth(1.0f); // Depth Buffer Setup 
glEnable(GL_DEPTH_TEST); // Enables Depth Testing 
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do 
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations 

glEnable(GL_LIGHTING); 
glEnable(GL_COLOR_MATERIAL); 
glEnable(GL_NORMALIZE); 
glEnable(GL_TEXTURE_2D); 
glDepthFunc(GL_LEQUAL); 
float globalAmbient[4] = {0, 0, 0, 1}; 
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, globalAmbient); 

我使用的庫FreeImage的,它看起來相當不錯測試和廣泛的應用。

這裏是圖像加載代碼:

//image format 
FREE_IMAGE_FORMAT fif = FIF_UNKNOWN; 
//pointer to the image, once loaded 
FIBITMAP *dib(0); 
//pointer to the image data 
BYTE* bits(0); 
//image width and height 
unsigned int width(0), height(0); 
//OpenGL's image ID to map to 
GLuint gl_texID; 

//check the file signature and deduce its format 
fif = FreeImage_GetFileType(filename, 0); 
//if still unknown, try to guess the file format from the file extension 
if(fif == FIF_UNKNOWN) 
    fif = FreeImage_GetFIFFromFilename(filename); 
//if still unkown, return failure 
if(fif == FIF_UNKNOWN) 
    return false; 

//check that the plugin has reading capabilities and load the file 
if(FreeImage_FIFSupportsReading(fif)) 
    dib = FreeImage_Load(fif, filename); 
//if the image failed to load, return failure 
if(!dib) 
    return false; 

//retrieve the image data 
bits = FreeImage_GetBits(dib); 
//get the image width and height 
width = FreeImage_GetWidth(dib); 
height = FreeImage_GetHeight(dib); 
//if this somehow one of these failed (they shouldn't), return failure 
if((bits == 0) || (width == 0) || (height == 0)) 
    return false; 

//if this texture ID is in use, unload the current texture 
if(m_texID.find(texID) != m_texID.end()) 
    glDeleteTextures(1, &(m_texID[texID])); 

//generate an OpenGL texture ID for this texture 
glGenTextures(1, &gl_texID); 
//store the texture ID mapping 
m_texID[texID] = gl_texID; 
//bind to the new texture ID 
glBindTexture(GL_TEXTURE_2D, gl_texID); 

glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 

//store the texture data for OpenGL use 
glTexImage2D(GL_TEXTURE_2D, level, internal_format, width, height, 
    border, image_format, GL_UNSIGNED_BYTE, bits); 

//Free FreeImage's copy of the data 
FreeImage_Unload(dib); 

回答

7

位圖存儲BGR(藍 - 綠 - 紅)。您的加載代碼將其加載爲RGB(紅綠藍)。這是翻轉你的紅色和藍色頻道。

使用GL_BGR代替format參數glTexImage2D

+0

+1我想看看圖片就足以看到頻道被換掉了;-) - Alexandre Jasmin 5分鐘前 – 2010-11-04 02:15:13

+0

我很確定每個加載了位圖的人都已經看到了這一點,同樣的問題(包括我自己);) – 2010-11-04 02:29:15

+2

一個簡單的檢查也顯示位圖被顛倒渲染。 – 2010-11-04 08:29:27

2

我不知道你是如何加載你的位圖或你要告訴OpenGL使用什麼像素格式,但是你正在交換紅色和藍色通道。 AFAIK位圖將像素存儲爲BGR,因此請確保何時將位圖加載爲BGR而不是RGB。