#include <windows.h>// Windows的头文件
#include <gl\gl.h>// OpenGL32库的头文件
#include <gl\glu.h>// GLu32库的头文件
#include <gl\glaux.h> // GLaux库的头文件
#include <stdio.h> // 标准输入/输出库的头文件 ( 新增 )
HGLRC hRC=NULL;// 永久着色描述表
HDC hDC=NULL;// 私有GDI设备描述表
HWND hWnd=NULL;// 保存我们的窗口句柄
HINSTANCE hInstance;// 保存程序的实例
GLfloat xrot; // X 旋转量 ( 新增 )
GLfloat yrot; // Y 旋转量 ( 新增 )
GLfloat zrot; // Z 旋转量 ( 新增 )
GLuint texture[1]; // 存储一个纹理 ( 新增 )
bool keys[256];// 用于键盘例程的数组
bool active=TRUE;// 窗口的活动标志,缺省为TRUE
bool fullscreen=TRUE; // 全屏标志缺省设定成全屏模式
GLfloat rtri=60; // 用于三角形的角度 ( 新增 )
GLfloat rquad; // 用于四边形的角度 ( 新增 )
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // WndProc的定义
AUX_RGBImageRec *LoadBMP(char *Filename) // 载入位图图象
{
FILE *File=NULL; // 文件句柄
if (!Filename) // 确保文件名已提供。
{
return NULL; // 如果没提供,返回 NULL
}
File=fopen(Filename,"r"); //尝试打开文件
if (File) // 文件存在么?
{
fclose(File); // 关闭句柄
return auxDIBImageLoad(Filename); //载入位图并返回指针
}
return NULL; // 如果载入失败,返回 NULL
}
int LoadGLTextures() // 载入位图(调用上面的代码)并转换成纹理
{
int Status=FALSE; // Status 状态指示器
AUX_RGBImageRec *TextureImage[1]; // 创建纹理的存储空间
memset(TextureImage,0,sizeof(void *)*1); // 将指针设为 NULL
// 载入位图,检查有无错误,如果位图没找到则退出。
if (TextureImage[0]=LoadBMP("Data/NeHe.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
}
GLvoid ReSizeGLScene(GLsizei width, GLsizei height)// 重置并初始化GL窗口大小
{
if (height==0)// 防止被零除
{
height=1;// 将Height设为1
}
glViewport(0, 0, width, height); // 重置当前的视口(Viewport
glMatrixMode(GL_PROJECTION);// 选择投影矩阵
glLoadIdentity();// 重置投影矩阵
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); // 计算窗口的外观比例
glMatrixMode(GL_MODELVIEW);// 选择模型观察矩阵
glLoadIdentity();// 重置模型观察矩阵
}
int InitGL(GLvoid)// 此处开始对OpenGL进行所有设置
{
if (!LoadGLTextures()) // 调用纹理载入子例程( 新增 )
{
return FALSE; // 如果未能载入,返回FALSE( 新增 )
}
glEnable(GL_TEXTURE_2D); // 启用纹理映射( 新增 )
glShadeModel(GL_SMOOTH); // 启用阴影平滑
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 黑色背景
glClearDepth(1.0f);// 设置深度缓存
glEnable(GL_DEPTH_TEST);// 启用深度测试
glDepthFunc(GL_LEQUAL); // 所作深度测试的类型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 真正精细的透视修正
return TRUE;
} // 初始化 OK
int DrawGLScene(GLvoid)// 从这里开始进行所有的绘制
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
glLoadIdentity(); // 重置当前的模型观察矩阵
glTranslatef(-3.5f,0.0f,-10.0f); // 左移 1.5 单位,并移入屏幕 6.0
glRotatef(rtri,1.0f,1.0f,0.0f); // 绕Y轴旋转三角形 ( 新增 )
glBegin(GL_TRIANGLES); // 绘制三角形
glColor3f(1.0f,0.0f,0.0f); // 红色
glVertex3f( 0.0f, 1.0f, 0.0f); // 三角形的上顶点 (前侧面)
glColor3f(0.0f,1.0f,0.0f); // 绿色
glVertex3f(-1.0f,-1.0f, 1.0f); // 三角形的左下顶点 (前侧面)
glColor3f(0.0f,0.0f,1.0f); // 蓝色
glVertex3f( 1.0f,-1.0f, 1.0f); // 三角形的右下顶点 (前侧面)
glColor3f(1.0f,0.0f,0.0f); // 红色
glVertex3f( 0.0f, 1.0f, 0.0f); // 三角形的上顶点 (右侧面)
glColor3f(0.0f,0.0f,1.0f); // 蓝色
glVertex3f( 1.0f,-1.0f, 1.0f); // 三角形的左下顶点 (右侧面)
glColor3f(0.0f,1.0f,0.0f); // 绿色
glVertex3f( 0.0f,-1.0f, -1.0f); // 三角形的右下顶点 (右侧面)
glColor3f(1.0f,0.0f,0.0f); // 红色
glVertex3f( 0.0f, 1.0f, 0.0f); // 三角形的上顶点 (后侧面)
glColor3f(0.0f,1.0f,0.0f); // 绿色
glVertex3f( -1.0f,-1.0f, 1.0f); // 三角形的左下顶点 (后侧面)
glColor3f(0.0f,0.0f,1.0f); // 蓝色
glVertex3f(0.0f,-1.0f, -1.0f); // 三角形的右下顶点 (后侧面)
glColor3f(0.0f,1.0f,0.0f); // 绿色
glVertex3f(-1.0f,-1.0f, 1.0f); // 三角形的左下顶点 (前侧面)
glColor3f(0.0f,0.0f,1.0f); // 蓝色
glVertex3f( 1.0f,-1.0f, 1.0f); // 三角形的右下顶点 (前侧面)
glColor3f(0.0f,0.0f,1.0f); // 蓝色
glVertex3f(0.0f,-1.0f, -1.0f); // 三角形的右下顶点 (后侧面)
glEnd(); // 三角形绘制结束
/*
glLoadIdentity(); // 重置模型观察矩阵
glTranslatef(1.5f,0.0f,-6.0f); // 右移1.5单位,并移入屏幕 6.0
// glLoadIdentity(); // 重置模型观察矩阵
// glTranslatef(3.0f,0.0f,0.0f); // 右移1.5单位,并移入屏幕 6.0
glRotatef(rquad,1.0f,1.0f,1.0f); // 绕X轴旋转四边形 ( 新增 )
glColor3f(0.5f,0.5f,1.0f); // 一次性将当前色设置为蓝色
glBegin(GL_QUADS); // 绘制正方形
glVertex3f(-1.0f, 1.0f, 0.0f); // 左上
glVertex3f( 1.0f, 1.0f, 0.0f); // 右上
glVertex3f( 1.0f,-1.0f, 0.0f); // 左下
glVertex3f(-1.0f,-1.0f, 0.0f); // 右下
glEnd(); // 正方形绘制结束
*/
glLoadIdentity();
glTranslatef(3.5f,0.0f,-12.0f); // 先右移再移入屏幕
glRotatef(rquad,1.0f,1.0f,1.0f); // 在XYZ轴上旋转立方体
glBegin(GL_QUADS); // 开始绘制立方体
glColor3f(0.0f,1.0f,0.0f); // 颜色改为蓝色
glVertex3f( 1.0f, 1.0f,-1.0f); // 四边形的右上顶点 (顶面)
glVertex3f(-1.0f, 1.0f,-1.0f); // 四边形的左上顶点 (顶面)
glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左下顶点 (顶面)
glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的右下顶点 (顶面)
glColor3f(1.0f,0.5f,0.0f); // 颜色改成橙色
glVertex3f( 1.0f,-1.0f, 1.0f); // 四边形的右上顶点(底面)
glVertex3f(-1.0f,-1.0f, 1.0f); // 四边形的左上顶点(底面)
glVertex3f(-1.0f,-1.0f,-1.0f); // 四边形的左下顶点(底面)
glVertex3f( 1.0f,-1.0f,-1.0f); // 四边形的右下顶点(底面)
glColor3f(1.0f,0.0f,0.0f); // 颜色改成红色
glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的右上顶点(前面)
glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左上顶点(前面)
glVertex3f(-1.0f,-1.0f, 1.0f); // 四边形的左下顶点(前面)
glVertex3f( 1.0f,-1.0f, 1.0f); // 四边形的右下顶点(前面)
glColor3f(1.0f,1.0f,0.0f); // 颜色改成黄色
glVertex3f( 1.0f,-1.0f,-1.0f); // 四边形的右上顶点(后面)
glVertex3f(-1.0f,-1.0f,-1.0f); // 四边形的左上顶点(后面)
glVertex3f(-1.0f, 1.0f,-1.0f); // 四边形的左下顶点(后面)
glVertex3f( 1.0f, 1.0f,-1.0f); // 四边形的右下顶点(后面)
glColor3f(0.0f,0.0f,1.0f); // 颜色改成蓝色
glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的右上顶点(左面)
glVertex3f(-1.0f, 1.0f,-1.0f); // 四边形的左上顶点(左面)
glVertex3f(-1.0f,-1.0f,-1.0f); // 四边形的左下顶点(左面)
glVertex3f(-1.0f,-1.0f, 1.0f); // 四边形的右下顶点(左面)
glColor3f(1.0f,0.0f,1.0f); // 颜色改成紫罗兰色
glVertex3f( 1.0f, 1.0f,-1.0f); // 四边形的右上顶点(右面)
glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的左上顶点(右面)
glVertex3f( 1.0f,-1.0f, 1.0f); // 四边形的左下顶点(右面)
glVertex3f( 1.0f,-1.0f,-1.0f); // 四边形的右下顶点(右面)
glEnd(); // 立方体绘制结束
rtri+=0.1f; // 增加三角形的旋转变量(新增)
rquad-=0.1f; // 减少四边形的旋转变量(新增)
glLoadIdentity(); // 重置当前的模型观察矩阵
glTranslatef(0.0f,0.0f,-7.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);
// 前面