|
|
#include <windows.h>
#include <stdio.h>
#include <math.h>
#include"string.h"
#include <GL/gl.h>
#include <GL/glaux.h>
#pragma comment( lib, "opengl32.lib") // OpenGL32连接库
#pragma comment( lib, "glu32.lib") // GLu32连接库
#pragma comment( lib, "glaux.lib") // GLaux连接库
HDC hDC=NULL; // Private GDI Device Context
HGLRC hRC=NULL; // Permanent Rendering Context
HWND hWnd=NULL; // Holds Our Window Handle
HINSTANCE hInstance; // Holds The Instance Of The Application
void CALLBACK myReshape(GLsizei w, GLsizei h);
void CALLBACK display(void);
GLuint base; // Base Display List For The Font Set
GLfloat rot; // Used To Rotate The Text
GLuint texture[1]; // 定义创建一个存放纹理的内存区域
char string[5][15]={{"Apple.bmp"},{"Grass.bmp"},{"Nehe.bmp"},{"2.bmp"},{"3.bmp"}};
GLvoid BuildFont(GLvoid) // Build Our Bitmap Font
{
GLYPHMETRICSFLOAT gmf[256]; // Address Buffer For Font Storage
HFONT font; // Windows Font ID
base = glGenLists(256); // Storage For 256 Characters
font = CreateFont( -12, // Height Of Font
0, // Width Of Font
0, // Angle Of Escapement
0, // Orientation Angle
FW_BOLD, // Font Weight
FALSE, // Italic
FALSE, // Underline
FALSE, // Strikeout
SYMBOL_CHARSET, // Character Set Identifier
OUT_TT_PRECIS, // Output Precision
CLIP_DEFAULT_PRECIS, // Clipping Precision
ANTIALIASED_QUALITY, // Output Quality
FF_DONTCARE|DEFAULT_PITCH, // Family And Pitch
"Comic Sans MS"); // Font Name
SelectObject(hDC, font); // Selects The Font We Created
wglUseFontOutlines( hDC, // Select The Current DC
0, // Starting Character
255, // Number Of Display Lists To Build
base, // Starting Display Lists
0.1f, // Deviation From The True Outlines
0.2f, // Font Thickness In The Z Direction
WGL_FONT_POLYGONS, // Use Polygons, Not Lines
gmf); // Address Of Buffer To Recieve Data
}
GLvoid KillFont(GLvoid) // Delete The Font
{
glDeleteLists(base, 256); // Delete All 256 Characters
}
GLvoid glPrint(char *text) // Custom GL " rint" Routine
{
if (text == NULL) // If There's No Text
return; // Do Nothing
glPushAttrib(GL_LIST_BIT); // Pushes The Display List Bits
glListBase(base); // Sets The Base Character to 32
glCallLists(strlen(text), GL_UNSIGNED_BYTE, text); // Draws The Display List Text
glPopAttrib(); // Pops The Display List Bits
}
AUX_RGBImageRec *LoadBMP(char *Filename) // 导入位图
{
FILE *File=NULL;
if (!Filename) // 检查文件名是否存在
{
return NULL; // 如果不存在返回空值
}
File=fopen(Filename,"r"); // 以只读方式打开文件
if (File) // 检查文件是否存在
{
fclose(File); // 关闭文件操作
return auxDIBImageLoad(Filename); // 导入位图文件,返回指针
}
return NULL; // 导入失败返回空值
}
void LoadGLTextures() // 导入位图转化为纹理
{
static int count=0;
count++;
if(count%6==0)
count=1;
AUX_RGBImageRec *TextureImage[1]; // 创建一个存放纹理的内存区域
memset(TextureImage,0,sizeof(void *)*1); // 指针指向空值
if (TextureImage[0]=LoadBMP(string[count-1])) // 导入位图,如果没有发现就退出
{
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_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
}
if (TextureImage[0]) //检查纹理是否存在
{
if (TextureImage[0]->data) // 如果纹理图象存在
{
free(TextureImage[0]->data); // 释放纹理图象内存
}
free(TextureImage[0]); // 释放图象结构体
}
}
void InitGL()
{
LoadGLTextures(); // 调用导入位图转化为纹理函数
BuildFont(); // Build The Font
glShadeModel(GL_SMOOTH); // Enable Smooth Shading
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background
glClearDepth(1.0f); // 创建深度缓存
glEnable(GL_DEPTH_TEST); //启动 Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
glEnable(GL_LIGHT0); // Quick And Dirty Lighting (Assumes Light0 Is Set Up)
glEnable(GL_LIGHTING); // Enable Lighting
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
glEnable(GL_TEXTURE_2D); // Enable Texture Mapping
glBindTexture(GL_TEXTURE_2D, texture[0]); // Select The Texture
}
void DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除颜色缓存和深度缓存
glLoadIdentity(); // 初始化视景
glTranslatef(1.1f*float(cos(rot/16.0f)),0.8f*float(sin(rot/20.0f)),-3.0f); //平移
glRotatef(45,1.0f,0.0f,0.0f); //立方体绕x轴转动45度角
glRotatef(45,0.0f,1.0f,0.0f); //立方体绕y轴转动45度角
glPrint("S"); // Draw A Skull And Crossbones Symbol
}
void CALLBACK display(void)
{
DrawGLScene();
glFlush();
}
void CALLBACK myReshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
gluPerspective(60.0, 1.0*(GLfloat)w/(GLfloat)h, 1.0, 30.0);
glMatrixMode(GL_MODELVIEW);
}
void CALLBACK key_up()
{
}
void CALLBACK key_down()
{
}
void CALLBACK key_left()
{
}
void CALLBACK key_right()
{
}
void CALLBACK left_down(AUX_EVENTREC *event)
{
InitGL();
DrawGLScene();
}
void main(void)
{
auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);
auxInitPosition(0,0,500,500);
auxInitWindow("show_box");
InitGL();
DrawGLScene();
auxReshapeFunc(myReshape);
auxKeyFunc(AUX_UP,key_up);
auxKeyFunc(AUX_DOWN,key_down);
auxKeyFunc(AUX_LEFT,key_left);
auxKeyFunc(AUX_RIGHT,key_right);
auxMouseFunc(AUX_LEFTBUTTON,AUX_MOUSEDOWN,left_down);
auxMainLoop(display);
} |
|