使用核心配置文件时OpenGL纹理问题

时间:2011-01-24 09:24:17

标签: opengl profile core textures

我的问题在于,使用时 glutInitContextProfile(GLUT_CORE_PROFILE)而不是glutInitContextProfile(GLUT_COMPATIBILITY_PROFILE)纹理区域只保持黑色。 (只是为了强调:使用兼容性配置文件,一切都按照我期望的方式工作)

我正在使用DevIL加载我的纹理,通常使用ilutGLLoadImage(filename),因为我不确定DevIL是否正确设置了tex参数,我还使用该代码加载了一些纹理:

    ILuint img;
 ilGenImages(1, &img);
 ilBindImage(img);
 ILboolean ret = false;
 if((ret = ilLoadImage("...jpg"))){
  ret = ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE);
  if(!ret){
   std::cout << "image conversion failed" << std::endl;
  }

  glGenTextures(1, &texture[20]);
  glBindTexture(GL_TEXTURE_2D, texture[20]);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
  /*char imageData[27] = {
   127, 127, 127,
   127, 127, 127,
   127, 127, 127,
   127, 127, 127, 
   127, 127, 127,
   127, 127, 127,
   127, 127, 127,
   127, 127, 127,
   127, 127, 127,
  };*/
  //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 3, 3, 0, GL_RGB, GL_UNSIGNED_BYTE, imageData);

  glTexImage2D(GL_TEXTURE_2D, 0, ilGetInteger(IL_IMAGE_BPP), ilGetInteger(IL_IMAGE_WIDTH),
       ilGetInteger(IL_IMAGE_HEIGHT), 0, ilGetInteger(IL_IMAGE_FORMAT), GL_UNSIGNED_BYTE,
       ilGetData());
 }
 else{
  std::cout << "image file not found" << std::endl;
 }
 ilDeleteImages(1, &img);

我测试了不同的tex参数没有成功,使用那些,至少应该没有涉及mipmapping相关的问题。 当我使用带有imagedata数组的注释部分时,一切正常,所以我想绑定,绘图和着色没有问题。如果您认为该签名可能出现问题,我会发布更多代码。

我知道,对于核心配置文件,由于某些原因,纹理可能被视为“不完整”,但我无法找到为什么会发生这种情况。我没有从DevIL或OpenGL那里得到任何错误。

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

您应该检查GL错误,ilGetInteger(IL_IMAGE_BPP)返回每个像素的字节数,这不是内部格式枚举值。请改用枚举,例如GL_RGB或GL_RGBA。这在兼容性配置文件中有效,但不在核心配置文件中。