title: OpenGL Renders texture with different color than original image?
body: <p>Why are these not displaying the same colors?</p>
  
  <p>Original Image:</p>
  
  <p><img src="https://i.stack.imgur.com/pTT8E.png" alt="alt text"></p>
  
  <p>Plane with above Image as texture:
  <img src="https://i.stack.imgur.com/2HXOq.jpg" alt="alt text"></p>
  
  <p>WTF is happening?
  The original image is 100x100 pixels, made in paint and saved as a 24 bit bitmap.
  Here is my opengl initialization code:</p>
  
  <pre><code>    _hdc = GetDC(_hwnd);
  
  PIXELFORMATDESCRIPTOR pfd;
  ZeroMemory( &amp;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, &amp;pfd );
  SetPixelFormat( _hdc, iFormat, &amp;pfd );
  
  _hrc = wglCreateContext(_hdc);
  wglMakeCurrent(_hdc, _hrc);
  
  GLHelper* helper = GLHelper::get();
  helper-&gt;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);
  </code></pre>
  
  <p>I use the library FreeImage, which looks pretty well tested and widely used.</p>
  
  <p>Here is the image loading code:</p>
  
  <pre><code>//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, &amp;(m_texID[texID]));
  
  //generate an OpenGL texture ID for this texture
  glGenTextures(1, &amp;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);
  </code></pre>