OpenGL_10 3D空间中移动图像

在本节中,并没有新的知识,只是通过glTranslatef()和glRotatef()函数对星星纹理映射的矩形的位置变换以及glColor4ub()函数对星星颜色改变达到混合效果实现星星自转、绕z轴旋转和闪烁的效果,可以说是对之前知识的回顾。

NEHEOpenGL例程的代码注释率达到90%以上,而51CTO翻译版的NEHE教程注释较少,上午又下载了NEHE例程源码,并将其英文注释全部翻译了一遍,算是对知识的一次巩固。

NeHe原版例程下载地址OpenGL教程Nehe版下载地址


#include "OpenGLSB.h"
#include 
#include          
#include "glaux.h"

HDC			hDC = NULL;		// 私有GDI设备环境
HGLRC		hRC = NULL;		// 永久透视环境
HWND		hWnd = NULL;	// 保持窗口句柄
HINSTANCE	hInstance;		// 保持应用实例

bool	keys[256];			// 键盘活动存储数组
bool	active = TRUE;		// 窗口有效标志默认设置为TRUE
bool	fullscreen = TRUE;	// 全屏标志默认设置为全屏

bool	twinkle;			// 闪烁的星星
bool	tp;					// ‘T’键按下?

const int	num = 50;		//要画的星星的个数

typedef struct				// 创建一个星星的结构体
{
	int r, g, b;			// 星星的颜色
	GLfloat dist,			// 星星距离中心的距离
		angle;			    // 星星当前角度
}
stars;
stars star[num];			// 需要保持对'num'个星星的追踪

GLfloat	zoom = -15.0f;		// 星星远离的距离
GLfloat tilt = 90.0f;		// 视角倾斜
GLfloat	spin;				// 旋转星星

GLuint	loop;				// 通用循环变量
GLuint	texture[1];			// 用于存储一个纹理

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;                               //状态指示器

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

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

														// 加载位图,检查错误,如果文图不存在则退出
	if (TextureImage[0] = LoadBMP("Data/Star.bmp"))
	{
		Status = TRUE;                            // 将状态设置未TRUE

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

												// 创建线性滤波纹理
		glBindTexture(GL_TEXTURE_2D, texture[0]);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
		glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
	}
	if (TextureImage[0])                            // 如果纹理存在
	{
		if (TextureImage[0]->data)              // 如果纹理图像存在
		{
			free(TextureImage[0]->data);    // 释放纹理图像内存
		}

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

	return Status;                                  // 返回状态
}

GLvoid ReSizeGLScene(GLsizei width, GLsizei height)		// 调整GL窗口并初始化
{
	if (height == 0)										// 避免A被0除
	{
		height = 1;										// 让高度等于1
	}

	glViewport(0, 0, width, height);						// 重置当前视角

	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.5f);				// 黑色背景
	glClearDepth(1.0f);									// 深度缓存启动
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	// 真实的nice级的场景计算
	glBlendFunc(GL_SRC_ALPHA, GL_ONE);					// 设置半透明混合函数
	glEnable(GL_BLEND);

	for (loop = 0; loop


你可能感兴趣的:(opengl)