码迷,mamicode.com
首页 > 其他好文 > 详细

opengl 一个可以运行的立方体贴图

时间:2016-07-05 19:06:27      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:opengl

对于开始学习opengl的人来说 下载一个可以运行的代码,对自己的鼓舞极大,但是网上下载的程序大多数由于这样那样的原因不能运行.有时会抱怨:照抄的啊 咋不行呢?其实原因很简单 主要是环境变了 库配置不对 版本不对 有的库是debug 而有的是release 所以导致不能运行.

下面这个例子是纹理贴图: 图片必须是能被2整除的 比如 128X128  512X512 文件名:MF.bmp 保证你运行而且可以手动控制旋转 ,由于开始贴在正面,所以你看到的是平面.按D键 立即旋转.

/ fangkuai.cpp : 定义控制台应用程序的入口点。

//


#include "stdafx.h"

#include "glut.h"  //引用相关包

#include <windows.h>

#include "glaux.h"> //用的是扩展库

#include <stdio.h> //基本IO口函数库 本例主要是读文件


#pragma comment( lib, "winmm.lib")//这个是加载声音

#pragma comment( lib, "opengl32.lib")

#pragma comment( lib, "glu32.lib")

#pragma comment( lib, "glaux.lib")


GLfloat  xrot;   // X 旋转量

GLfloat  yrot;   // Y 旋转量

GLfloat  zrot;   // Z 旋转量

GLuint  texture[1];  // 存储一个纹理

AUX_RGBImageRec *LoadBMP(CHAR *Filename)    // 载入位图图象

{

 FILE *File=NULL;         // 文件句柄

 if (!Filename)          // 确保文件名已提供

 {

  return NULL;         // 如果没提供,返回 NULL

 }

 File=fopen(Filename,"r");       // 尝试以读方式打开文件

 if (File)           // 文件存在么?

 {

  fclose(File);         // 关闭句柄

  return auxDIBImageLoadA(Filename);    // 载入位图并返回指针

 }

 return NULL;          // 如果载入失败,返回 NULL

}


int LoadGLTextures()         // 载入位图(调用上面的代码)并转换成纹理

{

 int Status=FALSE;         // 状态指示器

 AUX_RGBImageRec *TextureImage[1];     // 创建纹理的存储空间 这里创建一个

 memset(TextureImage,0,sizeof(void *)*1);   // 将指针设为 NULL

 // 载入位图,检查有无错误,如果位图没找到则退出

 if (TextureImage[0]=LoadBMP("mf.bmp"))   //加载位图  AUX只支持bmp格式

 {

  Status=TRUE;         // 将 Status 设为 TRUE

  glGenTextures(1, &texture[0]);     // 创建纹理


  // 使用来自位图数据生成 的典型纹理

  glBindTexture(GL_TEXTURE_2D, texture[0]);//依据加载的位图创建纹理

  // 生成纹理

  glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);


  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // 线形滤波

  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // 线形滤波

 }


 if (TextureImage[0])        // 纹理是否存在

 {

  if (TextureImage[0]->data)      // 纹理图像是否存在

  {

   free(TextureImage[0]->data);    // 释放纹理图像占用的内存

  }


  free(TextureImage[0]);       // 释放图像结构

 }

 return Status;          // 返回 Status

}


//绘制立方体

void DrawCube(void)         // 从这里开始进行所有的绘制

{

 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存

 glLoadIdentity();         // 重置当前的模型观察矩阵


 glTranslatef(0.0f,0.0f,-5.0f);         // 移入屏幕 5 个单位 网屏幕深处移动

 glRotatef(xrot,1.0f,0.0f,0.0f);         // 绕X轴旋转

 glRotatef(yrot,0.0f,1.0f,0.0f);         // 绕Y轴旋转

 glRotatef(zrot,0.0f,0.0f,1.0f);         // 绕Z轴旋转

 glBindTexture(GL_TEXTURE_2D, texture[0]);      // 选择纹理

 glBegin(GL_QUADS);//绘制正方形

  // 前面

  glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f); // 纹理和四边形的左下

  glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f); // 纹理和四边形的右下

  glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f); // 纹理和四边形的右上

  glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f); // 纹理和四边形的左上

  // 后面

  glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // 纹理和四边形的右下

  glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f); // 纹理和四边形的右上

  glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f); // 纹理和四边形的左上

  glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // 纹理和四边形的左下

  // 顶面

  glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f); // 纹理和四边形的左上

  glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f); // 纹理和四边形的左下

  glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f); // 纹理和四边形的右下

  glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f); // 纹理和四边形的右上

  // 底面

  glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // 纹理和四边形的右上

  glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // 纹理和四边形的左上

  glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f); // 纹理和四边形的左下

  glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f); // 纹理和四边形的右下

  // 右面

  glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // 纹理和四边形的右下

  glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f); // 纹理和四边形的右上

  glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f); // 纹理和四边形的左上

  glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f); // 纹理和四边形的左下

  // 左面

  glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // 纹理和四边形的左下

  glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f); // 纹理和四边形的右下

  glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f); // 纹理和四边形的右上

  glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f); // 纹理和四边形的左上

 glEnd();

    glFlush();  //立即有效

 xrot+=0.3f;              // X 轴旋转

 yrot+=0.2f;              // Y 轴旋转

 zrot+=0.4f;              // Z 轴旋转

}


void display(void)

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    // 清楚颜色数据和深度数据(清屏)

    glLoadIdentity();                                    // Reset The View

    glTranslatef(0.0f,0.0f,-5.0f);//旋转


    DrawCube();


    glutSwapBuffers();            //交换缓冲区。显示图形

}


//初始化

void init (void) 

{

    glClearColor (0.0, 0.0, 1.0, .0);            //清理颜色,为黑色,(也可认为是背景颜色) 透明色不能是背景透明


    glCullFace(GL_BACK);                        //背面裁剪(背面不可见)

    glEnable(GL_CULL_FACE);                        //启用裁剪

    glEnable(GL_TEXTURE_2D);

    LoadGLTextures();            //载入纹理贴图

}


//当窗口大小改变时,会调用这个函数

void reshape(GLsizei w,GLsizei h)

{

    //这里小说明一下:矩阵模式是不同的,他们各自有一个矩阵。投影相关

    //只能用投影矩阵。(只是目前情况下哦,等我学多了可能就知道为什么了。)


    glViewport(0,0,w,h);        //设置视口

    glMatrixMode(GL_PROJECTION);    //设置矩阵模式为投影变换矩阵,GL_PROJECTION  GL_TEXTURE

    glLoadIdentity();                //变为单位矩阵

    gluPerspective(60, (GLfloat)w / h, 0, 1000);    //设置投影矩阵

    glMatrixMode(GL_MODELVIEW);        //设置矩阵模式为视图矩阵(模型)

    glLoadIdentity();                //变为单位矩阵

}


//键盘输入事件函数

void keyboard(unsigned char key,int x,int y)

{

 switch(key)

 {

 case ‘d‘:    //当按下键盘上d时,以沿X轴旋转为主

  xrot+=1.0f;   //设置旋转增量

  glutPostRedisplay();   //重绘函数

  break;

 case ‘s‘:

  yrot+=1.0f;

  glutPostRedisplay();

  break;

 case ‘a‘:

  zrot+=1.0f;

  glutPostRedisplay();

  break;

 default:

  break;

 }

}


int main(int argc, char *argv[])

{

    glutInit(&argc, argv);  //固定格式

    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); 

    glutInitWindowSize(600, 600);    //显示框的大小

    glutInitWindowPosition(100,100); //确定显示框左上角的位置

    glutCreateWindow("OpenGL纹理贴图");

 init ();                                //初始化资源,这里一定要在创建窗口以后,不然会无效。

 LoadGLTextures();

    glutDisplayFunc(display);

 glutReshapeFunc(reshape);                //绘制图形时的回调

    glutKeyboardFunc(keyboard);

    glutMainLoop();

    return 0;

}


 


本文出自 “11486263” 博客,请务必保留此出处http://11496263.blog.51cto.com/11486263/1796031

opengl 一个可以运行的立方体贴图

标签:opengl

原文地址:http://11496263.blog.51cto.com/11486263/1796031

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!