OpenGL给立方体纹理贴图

没有昵称阿
阿里巴巴Java技术专家
博客专家认证
2012-03-11 10:48:16
下面是我的代码,实现的功能是绘制一个立方体,并给六个面贴上不同的纹理,(导入的六张bmp图片都是256*256大小的)。但是看到的效果是乱的,谁能帮我看看嘛?感激不尽~~

在这里我用到了SOIL(Simple OpenGL Image Library)库:http://nehe.gamedev.net/tutorial/lesson_06_texturing_update/47002/

我的代码:
#include <GL/glut.h>
#include <stdio.h>
#include <stdlib.h>

#include "SOIL.h"

GLuint texture[6];//6 textures for 6 faces of the cube

GLfloat xRot,yRot,zRot;//control cube's rotation

//load the bitmap and convert it into a texture
int LoadGLTextures()
{
int Status = 0;
char *bmpFile[6] = {"BmpFile/Ferrary.bmp","BmpFile/Honda.bmp","BmpFile/Hust.bmp",
"BmpFile/Lamborghini.bmp","BmpFile/NeHe.bmp","BmpFile/Porsche.bmp"};
for (int i = 0;i < 6;++i)
{
texture[i] = SOIL_load_OGL_texture(
bmpFile[i],
SOIL_LOAD_AUTO,
SOIL_CREATE_NEW_ID,
SOIL_FLAG_INVERT_Y);
printf("texture[%d]: %d\n",i,texture[i]);
if(texture[i] == 0)
Status = 0;
glBindTexture(GL_TEXTURE_2D,texture[i]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
}

return Status;
}

int init()
{
glEnable(GL_TEXTURE_2D);
if(!LoadGLTextures())
return 0;
glShadeModel(GL_SMOOTH);
glClearColor(0.0f,0.0f,0.0f,0.5f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
return 1;
}

void display()
{
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);

//glRotatef(45,1.0f,0.0f,0.0f);
//glRotatef(45,0.0f,1.0f,0.0f);

glBindTexture(GL_TEXTURE_2D,texture[0]);

glBegin(GL_QUADS);
// Front Face
// 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();

glBindTexture(GL_TEXTURE_2D,texture[1]);
glBegin(GL_QUADS);
// Back Face
// 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);
glEnd();

glBindTexture(GL_TEXTURE_2D,texture[2]);
glBegin(GL_QUADS);
// Top Face
// 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);
glEnd();

glBindTexture(GL_TEXTURE_2D,texture[3]);
glBegin(GL_QUADS);
// Bottom Face
// 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(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glEnd();

glBindTexture(GL_TEXTURE_2D,texture[4]);
glBegin(GL_QUADS);
// Right face
// 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);
glEnd();

glBindTexture(GL_TEXTURE_2D,texture[5]);
glBegin(GL_QUADS);
// Left Face
// 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();

/*xRot += 0.3f;
yRot += 0.4f;
zRot += 0.5f;*/

glutSwapBuffers();
}

void reshape(int w,int h)
{
if (0 == h)
h = 1;

glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0f,(GLfloat)w / (GLfloat)h,1,100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void keyboard(unsigned char key,int x,int y)
{
switch(key){
case 'x':
xRot += 1.0f;
glutPostRedisplay();
break;
case 'y':
yRot += 1.0f;
glutPostRedisplay();
break;
case 'z':
zRot += 1.0f;
glutPostRedisplay();
break;
default:
break;
}
}

int main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(400,400);
glutInitWindowPosition(100,100);
glutCreateWindow("Texture Map");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}


运行效果:




正常效果应该是这样子的:

可以看出,有的面上纹理可以看见,但是有的不能看见。所以就乱了~~

这是为什么啊?
求指导~~~~~
...全文
1492 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tnb1992 2012-07-11
  • 打赏
  • 举报
回复
我试过了,是没有剔除背面的问题
在init函数中加上
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
就OK了
the_venus 2012-04-01
  • 打赏
  • 举报
回复
问题出在你没有调用glGenTextures(6,texture);在LoadGLTextures()中的循环前面加上它。并在main()函数的glutMainLoop()函数后面调用glDeleteTextures(6,texture);再看看吧。。。。
mandera 2012-03-14
  • 打赏
  • 举报
回复
刚开始研究OPENGL, 是不是需要打开glEnable(GL_DEPTH_TEST) 或者 glEnable(GL_CULL_FACE)?
没有昵称阿 2012-03-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mandera 的回复:]

刚开始研究OPENGL, 是不是需要打开glEnable(GL_DEPTH_TEST) 或者 glEnable(GL_CULL_FACE)?
[/Quote]

不是的。我以及找到问题所在了,是LoadGLTextures函数的返回值的初始化设置错误了~~
没有昵称阿 2012-03-11
  • 打赏
  • 举报
回复
有人能够发现我的问题吗?求指导~~
安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app开发项目-OpenGL 3D立方体纹理贴图(源码).zip安卓app

4,499

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧