⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 在程序中根据3D地形的高度图动态地生成光照图,其中已包含了3D地形混合纹理生成的代码,使用C++和OpenGL进行编写.
💻 CPP
字号:
#include <ctime>
#include <string>
#include <iostream>
#include "BruteForce.h"

using namespace std;

BruteForce g_BruteForce;	

// 多重纹理扩展函数
PFNGLMULTITEXCOORD2FARBPROC	glMultiTexCoord2fARB = NULL;
PFNGLACTIVETEXTUREARBPROC	glActiveTextureARB = NULL;

GLfloat g_fMinIllumination = 0.2f;
GLfloat g_MaxIllumination = 0.9f;
GLint g_iSoftess = 15;
GLint g_iDerctionX = 1;
GLint g_iDerctionZ = 1;

//---------ChangeSize---------------
// 描述:当窗口大小尺寸发生变化时
//		调用以更新窗口尺寸状态
// 参数;width - 窗口宽度(单位为像素)
//		height - 窗口高度
// 返回:无
//----------------------------------
void ChangeSize(int width, int height)
{
	if (height == 0)									// 防止被零除
	{
		height = 1;										// 将Height设为1
	}

	glViewport(0,0,width,height);						// 将视口得当大小设置为窗口客户区域的大小

	glMatrixMode(GL_PROJECTION);						// 选择投影矩阵
	glLoadIdentity();									// 重置投影矩阵

	// 设置透视图
	gluPerspective(45.0f,(GLfloat) width/(GLfloat) height,1.0f,1000.0f);  
	//gluPerspective(45.0f, width/height,1.0f,1000.0f);  

	glMatrixMode(GL_MODELVIEW);							// 选择模型观察矩阵
	glLoadIdentity();									// 重置模型观察矩阵
}

//---------CleanUp------------
// 描述:释放对象或显示列表
// 参数;无
// 返回:无
//----------------------------
void CleanUp()
{

}

//---------RetGenerateIlluminationMap------------
// 描述:重新生成照明图
// 参数;无
// 返回:无
//----------------------------
GLvoid RetGenerateIlluminationMap()
{
	// 销毁前一个照明图
	g_BruteForce.CleanUpIlluminationData();
	// 定义slope照明参数
	g_BruteForce.CustomizeSlopeIlluminationParameter(g_fMinIllumination, g_MaxIllumination, g_iSoftess, g_iDerctionX, g_iDerctionZ);

	// 生成照明图
	if (g_BruteForce.GenerateIlluminationMapAccordingHeightMap(HeightMap::BaseOnSlopeIllumination) != GL_TRUE)
	{	
		exit(-1);
	}	
}

//---------KeysBoard----------
// 描述:处理键盘输入
// 参数;key - 键位码
//		x - 
//		y - 
// 返回:无
//---------------------------
void KeysBoard(unsigned char key, int x, int y)
{
	switch (key) 
	{
	case 27:	// 按下Esc退出键
		{
			CleanUp();	// 清除相关分配的资源
			exit(0);
		}

	case 'A':
	case 'a':
		{
			// 使用Fault Formation算法生成地形
			if (g_BruteForce.GenerateTerrainWithPlasma(128, 1.0f) != GL_TRUE)
			{
				exit(-1);
			}

			// 使用Fault Formation算法生成地形
			//if (g_BruteForce.GenerateTerrainWithFault(128, 64, 0, 2555, 0.25f) != GL_TRUE)
			//{
			//	exit(-1);
			//}
			// 设置地形缩放比例
			g_BruteForce.SetScale(0.25f);
			glutPostRedisplay();
			break;
		}

	case 'S':
	case 's':
		{
			// 生成地形纹理
			if (g_BruteForce.GenerateTerrainTexture(256) != GL_TRUE)
			{
				exit(-1);
			}
			glutPostRedisplay();
			break;
		}

	case 'D':
	case 'd':
		{
			static GLboolean flag = GL_TRUE;
			flag = !flag; 
			// 启动detail纹理
			g_BruteForce.SetDetailTextureFlag(flag);
			glutPostRedisplay();
			break;
		}

	case '1':
		{

			g_fMinIllumination += 0.01f;
			if (g_fMinIllumination >= g_MaxIllumination)
			{
				g_fMinIllumination -= 0.01f;
			}
			// 重新生成照明图
			RetGenerateIlluminationMap();
			glutPostRedisplay();
			break;
		}

	case '2':
		{

			g_fMinIllumination -= 0.01f;
			if (g_fMinIllumination < 0.0f)
			{
				g_fMinIllumination += 0.01f;
			}
			// 重新生成照明图
			RetGenerateIlluminationMap();
			glutPostRedisplay();
			break;
		}

	case '3':
		{
			g_MaxIllumination += 0.01f;
			if (g_MaxIllumination > 1.0f)
			{
				g_MaxIllumination -= 0.01f;
			}
			// 重新生成照明图
			RetGenerateIlluminationMap();	
			glutPostRedisplay();
			break;
		}

	case '4':
		{
			g_MaxIllumination -= 0.01f;
			if (g_MaxIllumination <= g_fMinIllumination)
			{
				g_MaxIllumination += 0.01f;
			}
			// 重新生成照明图
			RetGenerateIlluminationMap();
			glutPostRedisplay();
			break;
		}

	case '5':
		{
			++g_iSoftess;
			// 重新生成照明图
			RetGenerateIlluminationMap();
			glutPostRedisplay();
			break;
		}

	case '6':
		{
			--g_iSoftess;
			if (g_iSoftess <= 0)
			{
				++g_iSoftess;
			}
			// 重新生成照明图
			RetGenerateIlluminationMap();
			glutPostRedisplay();
			break;
		}

	case '7':
		{
			++g_iDerctionX;
			// 重新生成照明图
			RetGenerateIlluminationMap();
			glutPostRedisplay();
			break;
		}

	case '8':
		{
			--g_iDerctionX;
			if (g_iDerctionX <= 0)
			{
				++g_iDerctionX;
			}
			// 重新生成照明图
			RetGenerateIlluminationMap();
			glutPostRedisplay();
			break;
		}

	case '9':
		{
			++g_iDerctionZ;
			// 重新生成照明图
			RetGenerateIlluminationMap();
			glutPostRedisplay();
			break;
		}

	case '0':
		{
			--g_iDerctionZ;
			if (g_iDerctionZ <= 0)
			{
				++g_iDerctionZ;
			}
			// 重新生成照明图
			RetGenerateIlluminationMap();
			glutPostRedisplay();
			break;

		}
	default:
		{
			break;
		}
	}
}

//---------InitGL-----------------
// 描述:初始化渲染状态
// 参数;无
// 返回:无
//--------------------------------
void InitGL()
{
	//glEnable(GL_LIGHT0);		// 启动0号光源
	//glEnable(GL_LIGHTING);		// 启动光照(光照计算)

	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);				     // 背景颜色
	glShadeModel(GL_SMOOTH);							     // 启用阴影平滑
	glEnable(GL_DEPTH_TEST);							     // 启用深度测试
	glEnable(GL_CULL_FACE);									 // 启动被面剔除
	glFrontFace(GL_CCW);                                     // 使逆向绘制的面为正面
	glEnable(GL_TEXTURE_2D);							     // 默认启动启用二维纹理

	// 告诉OpenGL我们希望进行最好的透视修正
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	     // 告诉系统对透视进行修正

	// 设置随机种子
	srand( time(NULL) );  

	const string TexturePath[4] = { "lowestTile.bmp", "lowTile.bmp",
		"HighTile.bmp", "highestTile.bmp" };

	// 载入纹理砖瓦
	for (GLint i = 0; i < 4; ++i)
	{
		if (g_BruteForce.LoadTerrainTextureTile(TexturePath[i]) != GL_TRUE)
		{
			exit(-1);
		}
	}

	// 为纹理砖瓦创建对应的区域对象
	g_BruteForce.GenerateTextureTileRegion();

	// 载入detail纹理
	if (g_BruteForce.GenerateDetailTexture("detailMap.jpg") != GL_TRUE)
	{
		exit(-1);
	}

	// 设置detail纹理的重复次数
	g_BruteForce.SetDetailRepeat(8);
	// 启动detail纹理
	g_BruteForce.SetDetailTextureFlag(GL_TRUE);

	// 使用Fault Formation算法生成地形
	if (g_BruteForce.GenerateTerrainWithPlasma(128, 1.0f) != GL_TRUE)
	{
		exit(-1);
	}
	// 使用Fault Formation算法生成地形
	//if (g_BruteForce.GenerateTerrainWithFault(128, 64, 0, 2555, 0.25f) != GL_TRUE)
	//{
	//	exit(-1);
	//}
	// 设置地形缩放比例
	g_BruteForce.SetScale(0.25f);

	// 生成地形混合纹理
	if (g_BruteForce.GenerateTerrainTexture(256) != GL_TRUE)
	{
		exit(-1);
	}

	// 载入照明图
	//if (g_BruteForce.LoadIlluminationMapFromFile("lightmap.raw", 128) != GL_TRUE)
	//{
	//	exit(-1);
	//}

	// 定义slope照明参数
	g_BruteForce.CustomizeSlopeIlluminationParameter(0.2f, 0.9f, 15, 1, 1);

	// 生成照明图
	if (g_BruteForce.GenerateIlluminationMapAccordingHeightMap(HeightMap::BaseOnSlopeIllumination) != GL_TRUE)
	{	
		exit(-1);
	}

	// 设置""照明"颜色
	g_BruteForce.SetIlluminationColor( Vector3(1.0f, 1.0f, 1.0f) );

	// 检测是否支持多重纹理,并获得多重纹理函数
	if (GL_ARB_multitexture)
	{
		glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC) wglGetProcAddress("glMultiTexCoord2fARB");
		glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC) wglGetProcAddress("glActiveTextureARB");
	}
	else
	{
		exit(-1);
	}

}

//---------RenderScene------------
// 描述:绘制场景
// 参数;无
// 返回:无
//--------------------------------
void RenderScene()
{
	// 设置标题文本
	ostringstream strStream;
	strStream << "MinIllumination: " << g_fMinIllumination << " MaxIllumination: " 
		<< g_MaxIllumination << " Softess: " << g_iSoftess << " iDerctionX: " << g_iDerctionX
		<< " DerctionZ: " << g_iDerctionZ;

	string str = strStream.str();
	glutSetWindowTitle(str.c_str()); 

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	    // 清除屏幕和深度缓存
	glMatrixMode(GL_MODELVIEW);								// 设置操作矩阵为模型视图矩阵
	glLoadIdentity();										// 重置当前的模型观察矩阵

	glPushMatrix();                                         // 保存当前模型观察矩阵

	// 设置照相机的位置和视线方向
	//gluLookAt( 313.04019f, 390.87973f, 134.16623f,
	//	312.54050f, 390.01370f, 134.14877f,
	//	0.0f, 1.0f, 0.0f );  

	gluLookAt( 131.26527f, 208.49095f, 155.22302f,
		130.94115f, 207.63378f, 154.82277f,
		0.0f, 1.0f, 0.0f );  

	// 绘制高度地形照明小图
	g_BruteForce.RenderIlluminationSmallMap(640, 480);
	// 绘制高度地形
	glPushMatrix( );
	//glScalef(2.0f, 2.0f, 2.0f);
	g_BruteForce.Render();
	glPopMatrix( );

	glPopMatrix();	                                        // 恢复模型观察矩阵

	// 刷新绘制命令
	glutSwapBuffers();
}

// 主入口函数
int main(int argc, char* argv[])
{
	// 初始化Glut
	glutInit(&argc, argv);
	// 启动双缓冲,RGBA颜色缓冲和深度缓冲区
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
	// 设置窗口尺寸
	glutInitWindowSize(640,480);
	// 创建窗口
	glutCreateWindow("Glut框架");
	// 设置回调函数
	glutReshapeFunc(ChangeSize);
	glutKeyboardFunc(KeysBoard);
	glutDisplayFunc(RenderScene);
	glutIdleFunc(RenderScene);		// 设置管理背景过程函数

	// 初始化绘制状态
	InitGL();

	// 进入主程序循环
	glutMainLoop();
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -