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

问题描述 投票:0回答:1

我的问题是,当使用 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 参数,但没有成功,使用这些参数后,至少应该不会涉及 mipmap 相关的问题。 当我将注释部分与图像数据数组一起使用时,一切正常,所以我猜绑定、绘图和着色没有问题。如果您认为该签名可能会出现问题,我将发布更多代码。

我知道,对于核心配置文件,由于某些原因,纹理可以被视为“不完整”,但我只是找不到为什么会发生这种情况。我没有收到任何错误,无论是来自 DevIL 还是来自 OpenGL。

c opengl textures
1个回答
4
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.