我无法加载BMP texture
并将其显示在多维数据集的面上。
我正在处理Windows 7
。我的编译器是Visual Studio 2010 Express
。我使用{{ 1}}加载bmp.My图像位深度为24.我的图像大小为256 * 256.我正在使用FreeImage
创建窗口并处理事件。
当我编译并运行程序时,我的立方体仍然是白色的,其表面上没有显示任何内容。我正在将纹理加载到SDL
变量中。当我打印该变量时,它只打印“1”。我的一位朋友告诉我,我的显卡与此版本的GLuint
不兼容。所以我在虚拟机上的OpenGL
编译并运行程序,它工作正常。立方体成功纹理你可以帮助我在Ubuntu
上正确地运行吗?
如果你需要我的显卡是Windows
。
这是我的initgl函数:
NVIDIA GT240 DDR5
这是加载图像的函数.GLuint texture [1]之前已定义:
//OpenGL initialization.
int initGL(void)
{
glEnable(GL_TEXTURE_2D); //Enable texture mapping.
if(!loadGLTextures("bmp_24.bmp"))
return false;
glShadeModel(GL_SMOOTH);
glClearColor(0.0f , 0.0f , 0.0f , 0.5f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
//Nice perspective.
glHint(GL_PERSPECTIVE_CORRECTION_HINT , GL_NICEST);
return true;
}
这是我的渲染功能:
//This function will load a bitmap image.
bool loadGLTextures(const char* file)
{
FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
fif = FreeImage_GetFileType(file , 0);
if(fif == FIF_UNKNOWN)
fif = FreeImage_GetFIFFromFilename(file);
if(fif == FIF_UNKNOWN)
return false;
FIBITMAP* dib = FreeImage_Load(fif , file);
if(!dib)
return false;
//Create the texture.
glGenTextures(1 , &texture[0]);
//Typical texture generation using data from the bitmap.
glBindTexture(GL_TEXTURE_2D , texture[0]);
//Generate the texture.
glTexImage2D(GL_TEXTURE_2D , 0 , GL_RGB , FreeImage_GetWidth(dib) ,
FreeImage_GetHeight(dib) , 0 , GL_BGR_EXT , GL_UNSIGNED_BYTE ,
FreeImage_GetBits(dib));
//Linear filtering.
glTexParameteri(GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR);
printf("%d" , texture[0]);
FreeImage_Unload(dib);
return true;
}
答案 0 :(得分:5)
您的代码中可能会出现许多问题。
我的怀疑是,你过早地打电话给initGL()
,即没有上下文可用。你没有显示有问题的代码,所以我只能对此做出猜测。
启用纹理单元对于仅绘制非常重要。您可以上传纹理数据,纹理单元被禁用就好了。我强烈建议你将glEnable(GL_TEXTURE_2D);
放在四边形绘图代码之前,而不是其他地方(实际上你应该只将glEnable和glDisable调用到绘图代码中,原因有几个。)
加载纹理时,您无法执行多项健全性检查。此外,您忘记正确设置像素存储参数,但这会使您的纹理看起来扭曲。另外,从加载函数返回纹理ID而不是布尔值并将ID放入全局变量是有意义的。 Texuture ID 0是保留的,因此您可以使用它来指示错误。
您可以设置过滤器模式,因此这不是未定义mipmap级别的问题。
答案 1 :(得分:0)
GL_TEXTURES_2D
,因此在调用glEnable(GL_TEXTURE_2D);
之前需要调用glGenTextures(1 , &texture[0]);
另外,要启用透明度,您需要调用`glEnable(GL_BLEND);`
这仍然没有解释为什么它适用于Ubuntu而不适用于Windows ...我要说试一试,看看它是否有帮助。
编辑: 现在您已经发布了渲染功能,我注意到的一件事是您没有设置渲染颜色。 尝试拨打
glColor4f(r,g,b,a); // r, g, b and a are float between [0,1], specifying your desired color
介于glLoadIdentity();
和您的第一个glVertex3f
电话
答案 2 :(得分:0)
你的纹理尺寸可能不是2的力量,即1,2,4,8,16,32,64等等。
这也会在某些硬件上造成这样的问题,通常是在旧版本中。
干杯;)