opengl一个可以运行的立方体贴图-创新互联

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

网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、微信小程序定制开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了榆树免费建站欢迎大家使用!

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

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

//

#include "stdafx.h"

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

#include

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

#include //基本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;

}

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


本文标题:opengl一个可以运行的立方体贴图-创新互联
文章起源:http://pwwzsj.com/article/diocpg.html