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;

}

时间: 2024-08-01 06:27:14

opengl 一个可以运行的立方体贴图的相关文章

OpenGL+OpenCV实现立方体贴图

我屮艸芔茻,转眼就7月份了. 今天试了一下立方体贴图,比较简单,大概说下和平面贴图的区别. 1. 平面贴图需要的是纹理坐标vec2:立方体贴图需要的是一个方向向量vec3,长度没有关系,重要的是方向,OpenGL会根据方向向量与立方体的各个面的交点来采样纹理. 2.在立方体的六个面贴六张不同的图片,我用的方法是将六张图片读入到OpenCV的Mat数组中,需要从BGR转到RGB,然后一个一个去绑定纹理.此时区别2D纹理的地方在于要是用GL_TEXTURE_CUBE_MAP,而不再是GL_TEXTU

立方体贴图(Cubemap)

http://blog.csdn.net/asdjy123/article/details/51190643 点击打开链接 好东西保存方便查看 立方体贴图(Cubemap) 原文 Cubemaps 作者 JoeyDeVries 翻译 Django 校对 Geequlim 我们之前一直使用的是2D纹理,还有更多的纹理类型我们没有探索过,本教程中我们讨论的纹理类型是将多个纹理组合起来映射到一个单一纹理,它就是cubemap. 基本上说cubemap它包含6个2D纹理,这每个2D纹理是一个立方体(cu

Unity Shaders and Effects Cookbook (4-1)(4-2)静态立方体贴图的创建与使用

开始学习第4章 - 着色器的反射 看完了1.2节,来记录一下.反射主要是利用了 Cubemap 立方体贴图. 认识Cubemap 立方体贴图,就如同名字所说,在一个立方体上有6张图,就这样认为吧. 假想一下 ,在一个艳丽的房间里,有一个表面是镜子的圆球,那这个圆球表面就反射了房间里面的所有东西,就是一个大号的凸镜. 这是到网上找得一张图,很直观的表达了我的意思-- 注意标题中说的,静态立方体贴图,为什么叫静态,因为这一次使用的立方体贴图是提前生成好的图片,而不是动态生成的. 这又是什么意思呢?

threejs立方体贴图产生边缘锯齿问题

threejs立方体贴图产生边缘锯齿问题 立方体贴图边缘锯齿 解决后 经过试验测试发现, textureGrass.wrapS和 textureGrass.wrapT属性导致的. 解决方法1: 删掉textureGrass.wrapS和 textureGrass.wrap var textureGrass = new THREE.ImageUtils.loadTexture(src); // 此属性会产生抗锯齿 // 写法1:删除即可 /*textureGrass.wrapS = THREE.R

立方体贴图

立方体贴图,也称CubeMap.其实就是一张包含六个面的纹理贴图,一般情况下是加载六张贴图构成cubemap. 加载代码如下: void WKS::CubeMap::LoadCubeMap(std::vector<std::string> faces) { glGenTextures(1, &this->textureID); glBindTexture(GL_TEXTURE_CUBE_MAP, this->textureID); int width, height, nr

一个好用的web甘特图

前些天一直在弄web甘特图,发现网上很多web甘特图框架,但大部分是收费的.偶尔发现了向日葵甘特图 感觉不错,特此写下来一方面当做记录,另一方面也为寻找web甘特图的同学们少走一些弯路,双赢嘛~      向日葵甘特图是纯js编写,相比于其他庞大的甘特图应用,好处不用多说:轻便易于和网页应用嵌套(其他的同学们可以自己体会). 网上提供了一个远程js库和相应API,我们可以方便的进行二次开发.同学们网上一搜即可找到. 本甘特图以XML作为数据传输格式,基本格式如下: <Tasks> <Ta

使用CSS3生成一个会旋转的太极八卦图

学习了CSS3 后,可以做出很多炫酷的效果,但是基本功需要打扎实,就从学习使用纯CSS技术生成太极八卦图学起. 第一步,先使用HTML进行一下简单的布局,如下,只需要一个DIV即可: <body> <div></div> </body> 第二步,插入了DIV之后, 就需要为其添加样式,以及设置其为圆形,我们宽要设置的是高的2倍,这样在为底边框添加了宽度后,保证DIV出来后是圆形,如下: div { width:500px; height:250px; bor

NGUI字体贴图压缩以及相关Shader解读

一般游戏中,字体贴图是游戏贴图压缩的一个重点,特别是对于中文的游戏.考虑的字体贴图的特殊性,一般我们输出的字体贴图是不含颜色信息的,所以正常情况下,我们输出的字体贴图RGBA每一个通道都是一样的.这样一来,就存在非常大的浪费.所以我们能够在RGBA四个通道中能够保存不同的字体,这样,我们的贴图的大小能够降低4倍.假设我们想使用ETC压缩的话,我们可还以直接不使用Alpha通道,仅仅在RGB三个通道中存储不同的文字(这样,假设我们要进行ETC压缩的话,不须要对Alpha通道做分离处理了,可是得到的

开源一个跨平台运行的服务插件 - TaskCore.MainForm

本次将要很大家分享的是一个跨平台运行的服务插件 - TaskCore.MainForm,此框架是使用.netcore来写的,现在netcore已经支持很多系统平台运行了,所以将以前的Task.MainForm改良成跨平台的服务共大家使用和相互交流:本来这篇应该分享的是nginx+iis+redis+Task.MainForm构建分布式架构后续文章,但使用.netcore来定义一个服务插件和跨平台测试经过让我既兴奋又头痛,不说了下次再分享分布式后续文章吧:那么开始今天的分享内容,希望各位多多支持: