arm*_*git 3 c++ opengl sdl-opengl
我无法加载BMP texture
并在立方体的面上显示它.
我正在研究.Windows 7
我的编译器是Visual Studio 2010 Express
.I FreeImage
用来加载bmp.My图像位深度是24.我的图像大小是256*256.I我SDL
用来创建窗口并处理事件.
当我编译并运行程序时,我的立方体仍然是白色的,它的脸上没有显示任何东西.我正在将纹理加载到GLuint
变量中.当我打印该变量时,它只打印"1".我的一个朋友告诉我,我的显卡与这个版本的版本不兼容OpenGL
.因此,我Ubuntu
在虚拟机上编译并运行程序,它工作正常.立方体已成功纹理化.你可以帮我运行它我的Windows
呀?
如果你需要我的显卡是NVIDIA GT240 DDR5
.
这是我的initgl函数:
//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;
}
Run Code Online (Sandbox Code Playgroud)
这是加载图像的函数.GLuint纹理[1]之前已定义:
//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;
}
Run Code Online (Sandbox Code Playgroud)
这是我的渲染功能:
//All of the drawing goes through this.
int drawGLScene(void)
{
static float xrot = 0 , yrot = 0 , zrot = 0;
//Clear screen and depth buffer.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f , 0.0f , -5.0f);
glRotatef(xrot , 1.0f , 0.0f , 0.0f);
glRotatef(yrot , 0.0f , 1.0f , 0.0f);
glRotatef(zrot , 0.0f , 0.0f ,1.0f);
//Select the texture.
glBindTexture(GL_TEXTURE_2D , texture[0]);
glBegin(GL_QUADS);
//Front:
//Bottom left of the texture and quad.
glTexCoord2f(0.0f , 0.0f); glVertex3f(-1.0f , -1.0f , 1.0f);
//Bottom right fo the texture and quad.
glTexCoord2f(1.0f , 0.0f); glVertex3f(1.0f , -1.0f , 1.0f);
//Top right of the texture and quad.
glTexCoord2f(1.0f , 1.0f); glVertex3f(1.0f , 1.0f , 1.0f);
//Top left of the texture and quad.
glTexCoord2f(0.0f , 1.0f); glVertex3f(-1.0f , 1.0f , 1.0f);
//Back:
//Bottom left of the texture and quad.
glTexCoord2f(0.0f , 0.0f); glVertex3f(1.0f , -1.0f , -1.0f);
//Bottom right of the texture and quad.
glTexCoord2f(1.0f , 0.0f); glVertex3f(-1.0f , -1.0f , -1.0f);
//Top right of the texture and the quad.
glTexCoord2f(1.0f , 1.0f); glVertex3f(-1.0f , 1.0f , -1.0f);
//Top left of the texture and the quad.
glTexCoord2f(0.0f , 1.0f); glVertex3f(1.0f , 1.0f , -1.0f);
//Top:
//Top right of the texture and quad.
glTexCoord2f(1.0f , 1.0f); glVertex3f(1.0f , 1.0f , -1.0f);
//Top left of the texture and quad.
glTexCoord2f(0.0f , 1.0f); glVertex3f(-1.0f , 1.0f , -1.0f);
//Bottom left of the texture and quad.
glTexCoord2f(0.0f , 0.0f); glVertex3f(-1.0f , 1.0f , 1.0f);
//Bottom right of the texture and quad.
glTexCoord2f(0.0f , 1.0f); glVertex3f(1.0f , 1.0f , 1.0f);
//Bottom:
//Top left of the texture and quad.
glTexCoord2f(0.0f , 1.0f); glVertex3f(-1.0f , -1.0f , 1.0f);
//Bottom left of the texture and quad.
glTexCoord2f(0.0f , 0.0f); glVertex3f(-1.0f , -1.0f , -1.0f);
//Bottom right of the texture and quad.
glTexCoord2f(1.0f , 0.0f); glVertex3f(1.0f , -1.0f , -1.0f);
//Top right of the texture and quad.
glTexCoord2f(1.0f , 1.0f); glVertex3f(1.0f , -1.0f , 1.0f);
//Right:
//Bottom right of the texture and quad.
glTexCoord2f(1.0f , 0.0f); glVertex3f(1.0f , -1.0f , -1.0f);
//Top right of the texture and quad.
glTexCoord2f(1.0f , 1.0f); glVertex3f(1.0f , 1.0f , -1.0f);
//Top left of the texture and quad.
glTexCoord2f(0.0f , 1.0f); glVertex3f(1.0f , 1.0f , 1.0f);
//Bottom left of the texture and quad.
glTexCoord2f(0.0f , 0.0f); glVertex3f(1.0f , -1.0f , 1.0f);
//Left:
//Bottom left of the texture and quad.
glTexCoord2f(0.0f , 0.0f); glVertex3f(-1.0f , -1.0f , -1.0f);
//Bottom right of the texture and quad.
glTexCoord2f(1.0f , 0.0f); glVertex3f(-1.0f , -1.0f , 1.0f);
//Top right of the texture and quad.
glTexCoord2f(1.0f , 1.0f); glVertex3f(-1.0f , 1.0f , 1.0f);
//Top left of the texture and quad.
glTexCoord2f(0.0f , 1.0f); glVertex3f(-1.0f , 1.0f , -1.0f);
glEnd();
SDL_GL_SwapBuffers();
xrot += 0.1;
yrot += 0.1;
zrot += 0.1;
return true;
}
Run Code Online (Sandbox Code Playgroud)
您的代码中可能存在许多可能出错的问题.
我的怀疑是,你initGL()
过早地打电话,即没有上下文可用.你没有显示有问题的代码,所以我只能对此做出猜测.
启用纹理单元对于仅绘制非常重要.您可以上传纹理数据,纹理单元被禁用就好了.我强烈建议你把它放在glEnable(GL_TEXTURE_2D);
你的四维绘图代码之前,而不是其他地方(实际上你应该只将glEnable和glDisable调用到绘图代码中,原因有几个).
加载纹理您无法执行多项健全性检查.此外,您忘记正确设置像素存储参数,但这会使您的纹理看起来扭曲.另外,从加载函数返回纹理ID而不是布尔值并将ID放入全局变量是有意义的.Texuture ID 0是保留的,因此您可以使用它来指示错误.
您可以设置过滤器模式,因此这不是未定义mipmap级别的问题.
归档时间: |
|
查看次数: |
4442 次 |
最近记录: |