opengl - 使用核心配置文件时出现 OpenGL 纹理问题

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

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

感谢您的帮助。

最佳答案

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

关于opengl - 使用核心配置文件时出现 OpenGL 纹理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4780373/

相关文章:

java - 如何执行 Spring Boot 配置文件并使用 java -jar 命令以及 mvn spring-boot :run command? 传递命令行参数

Django 缓存用户的个人资料

java - 如何使可运行实例在一个线程中等待并由其他线程通知?

c - 在 python 中调试 c 扩展

c++ - 无法将法线添加到 .obj 网格

c++ - GLFW - 在不使用循环的情况下保持窗口

python - source ~/.profile 命令抛出奇怪的错误

java - Java 中的 NaN 问题

c++ - 在不同位置多次绘制 GLBatch

opengl - OpenGL 中的多个窗口?