我的问题在于,使用时 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那里得到任何错误。
感谢您的帮助。
答案 0 :(得分:4)
您应该检查GL错误,ilGetInteger(IL_IMAGE_BPP)返回每个像素的字节数,这不是内部格式枚举值。请改用枚举,例如GL_RGB或GL_RGBA。这在兼容性配置文件中有效,但不在核心配置文件中。