【问题标题】:OpenGL Renders texture with different color than original image?OpenGL渲染纹理与原始图像的颜色不同?
【发布时间】:2011-05-04 20:07:57
【问题描述】:

为什么这些不显示相同的颜色?

原图:

上面的图像作为纹理的平面:

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);

【问题讨论】:

    标签: c++ image opengl bitmap textures


    【解决方案1】:

    我不知道您是如何加载位图的,也不知道您告诉 OpenGL 使用什么像素格式,但您的红色和蓝色通道正在交换。 AFAIK 位图将像素存储为 BGR,因此请确保将位图加载为 BGR 而不是 RGB。

    【讨论】:

      【解决方案2】:

      位图存储为 BGR(蓝-绿-红)。您的加载代码将其加载为 RGB(红-绿-蓝)。这是翻转你的红色和蓝色通道。

      将GL_BGR 用于glTexImage2D 的format 参数。

      【讨论】:

      • +1 我想看看图片就足以看到频道被交换了 ;-) – Alexandre Jasmin 5 分钟前
      • 我很确定每个曾经加载过位图的人都曾在某个时候看到过这个问题并且有同样的问题(包括我自己);)
      • 一个简单的检查也显示位图被颠倒了。
      • 我找不到 GL_BGR,但我使用了 GL_BGE_EXT。有用!谢谢
      猜你喜欢
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      相关资源
      最近更新 更多