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

📄 terrain.h

📁 在程序中根据3D地形的高度图动态地生成光照图,其中已包含了3D地形混合纹理生成的代码,使用C++和OpenGL进行编写.
💻 H
字号:
#ifndef TERRAIN_H
#define TERRAIN_H

#include <cmath>
#include <string>
#include <vector>
#include <windows.h>
#include <gl\glee.h>		// 扩展库(此程序中非必须)
#include "toolFun.h"
#include "ImageLoad.h"
#include "Vector3.h"

#pragma warning(disable : 4996)

using std::string;
using std::vector;

//--------------
// HeightMap类
//--------------
class HeightMap
{
public:

	// 局部枚举
	//enum TextureTileType
	//{
	//	LowestTile = 0,	// 最低砖瓦纹理,例如:土地,灰尘
	//	LowTile,		// 较低砖瓦纹理,例如:草地
	//	HighTile,		// 较高砖瓦纹理,例如:岩石
	//	HighestTile		// 最高砖瓦纹理,例如:积雪
	//};

	// 地形光照类型枚举
	enum IlluminationType
	{
		BaseOnTerrainHeight = 0,	// 基于高度的
		BaseOnSlopeIllumination,	// 基于斜坡的
		FromOutsideIlluminationFile,// 来自外部导入的照明文件
		NoIllumination
	};

	// 局部类定义
	// 纹理作用区域类
	struct TextureRegion 
	{
		// 默认构造函数
		TextureRegion():m_iLowHeight(0),m_iOptimalHeight(0),m_iHighHeight(0){}

		// 公有数据
		GLint m_iLowHeight;			// 作用区域底限(0%)
		GLint m_iOptimalHeight;		// 最佳区域(100%)
		GLint m_iHighHeight;		// 作用区域上限(0%)
	};

	// 纹理砖瓦管理类,用于使用几个纹理生成地形纹理
	struct TextureTileManeger
	{
		// 默认构造函数
		TextureTileManeger():m_vecTexture(),m_vecTextureRegion(){}

		// 析构函数
		~TextureTileManeger();

		// 公有数据
		vector<ImageLoad*> m_vecTexture;
		vector<TextureRegion*> m_vecTextureRegion;
	};

	// 默认构造函数
	HeightMap():m_pHeightData(NULL),m_iHeightMapSize(0),m_fScale(0.0f),
		m_TextureTileManeger(),m_uiTerrainTextureID(0),m_pTerrainData(NULL),
		m_iTerrainTextureSize(0),m_bEnableDetailTexture(GL_FALSE),
		m_iRepeatDetailTexture(0),m_DetailTexture(),m_IlluminationType(NoIllumination),
		m_vecIlluminationColor(),m_pIlluminationData(NULL),m_iIlluminationMapSize(0),
		m_fMinBrightness(0.0f),m_fMaxBrightness(0.0f),m_fIlluminationSoftness(0.0f),
		m_iDirectionX(0),m_iDirectionZ(0){}

	// 虚析构函数
	virtual ~HeightMap();

	// 释放高度数据资源
	GLvoid CleanUpHeightData();

	// 释放地形纹理数据资源
	GLvoid CleanUpTerrainTextureData();

	// 释放光照数据资源
	GLvoid CleanUpIlluminationData();

	// 从文件载入高度图
	GLboolean LoadHeightMapFromFile(const string &heightMapFilePath, GLint size);

	// 将高度图数据写进一个文件中
	GLboolean WriteHeightMapToFile(const string &heightMapFileName) const;

	// 从文件中载入照明图
	GLboolean LoadIlluminationMapFromFile(const string &illuminationFilePath, GLint size);

	// 将照明图写进一个文件中
	GLboolean WriteIlluminationMapToFile(const string &illuminationMapFileName) const;

	// 使用Fault Formation算法生成地形
	GLboolean GenerateTerrainWithFault(GLuint size, GLint iterationTime, 
		GLint minHeight, GLint maxDelta, GLfloat filter);

	// 使用Midpoint Displacement算法生成随机地形
	GLboolean GenerateTerrainWithPlasma(GLint size, GLfloat roughness);

	// 载入地形纹理砖瓦
	GLboolean LoadTerrainTextureTile(const string &texturePath);

	// 为纹理砖瓦创建对应的区域对象
	GLvoid GenerateTextureTileRegion()
	{
		// 分配每个纹理砖瓦的区域对象
		for (size_t i = 0; i < m_TextureTileManeger.m_vecTexture.size(); ++i)
		{
			m_TextureTileManeger.m_vecTextureRegion.push_back(new TextureRegion);
		}
	}

	// 生成detail纹理
	GLboolean GenerateDetailTexture(const string &texturePath)
	{
		return m_DetailTexture.GenerateTexture(texturePath);
	}	

	// 生成地形纹理
	GLboolean GenerateTerrainTexture(GLint size);

	// 自定义生成照明图参数
	GLvoid CustomizeSlopeIlluminationParameter(GLfloat minBrightness, GLfloat maxBrightness, 
		GLfloat softness, GLint directionX, GLint directionZ)
	{
		m_fMinBrightness = minBrightness;
		m_fMaxBrightness = maxBrightness;
		m_fIlluminationSoftness = softness;
		m_iDirectionX = directionX;
		m_iDirectionZ = directionZ;
	}

	// 生成根据高度图生成照明图
	GLboolean GenerateIlluminationMapAccordingHeightMap(IlluminationType illuminationType);

	// 将高度图小图
	GLvoid RenderHeightSmallMap(GLint windowWidth, GLint windowHeight) const;

	// 将照明图小图
	GLvoid RenderIlluminationSmallMap(GLint windowWidth, GLint windowHeight) const;

	// 绘制高度图,纯虚函数
	virtual GLvoid Render() const = 0;	 

	// 设置detail纹理重复次数
	GLvoid SetDetailRepeat(GLint repeatDetailTexture)
	{
		m_iRepeatDetailTexture = repeatDetailTexture;
	}	

	// 设置detail纹理启动标志
	GLvoid SetDetailTextureFlag(GLboolean flag)
	{
		m_bEnableDetailTexture = flag;
	}

	// 返回高度图尺寸
	GLuint GetTerrainSize() const
	{
		return m_iHeightMapSize;
	}

	// 高度图缩放值
	GLfloat GetScale() const
	{
		return m_fScale;
	}

	// 设置高度图缩放值
	GLvoid SetScale(GLfloat scale)
	{
		m_fScale = scale;
	}

	// 设置高度图中指定点的高度值
	GLvoid SetHeightAtPoint(GLubyte height, GLint x, GLint z)
	{
		m_pHeightData[z*m_iHeightMapSize + x] = height;
	}

	// 返回高度图中指定点的高度值
	GLubyte GetHeightAtPoint(GLint x, GLint z) const
	{
		return m_pHeightData[z*m_iHeightMapSize + x];
	}

	// 返回高度图中指定点的缩放后的高度值
	GLubyte GetScaleHeightAtPoint(GLint x, GLint z) const
	{
		return m_pHeightData[z*m_iHeightMapSize + x]*m_fScale;
	}

	// 设置简单基于高度的光照颜色
	GLvoid SetIlluminationColor(const Vector3 &illuminationColor)
	{
		m_vecIlluminationColor = illuminationColor;
	}

	// 得到此顶点的被照明程度
	GLubyte GetIlluminationDegreeAtPoint(GLint x, GLint z) const
	{
		if (m_pIlluminationData != NULL)
		{
			return m_pIlluminationData[m_iIlluminationMapSize*z + x];
		}
		else
		{
			return 255;	// 默认为完全光照
		}
	}

	// 设置照明图指定位置的照明度
	GLvoid SetBrightnessAtPoint(GLint x, GLint z, GLubyte illuminationDegree)
	{
		if (m_pIlluminationData != NULL)
		{
			m_pIlluminationData[m_iIlluminationMapSize*z + x] = illuminationDegree;
		}
	}

protected:

	// 地形高度图数据成员
	GLubyte *m_pHeightData;		// 高度图数据
	GLint m_iHeightMapSize;		// 高度图尺寸
	GLfloat m_fScale;			// 高度图的缩放值
	
	// 地形纹理数据成员
	TextureTileManeger m_TextureTileManeger;	// 地形砖瓦管理对象
	GLuint m_uiTerrainTextureID;	// 地形纹理标识
	GLubyte *m_pTerrainData;		// 地形纹理数据
	GLint m_iTerrainTextureSize;	// 地形纹理尺寸
	GLboolean m_bEnableDetailTexture;	// 启动detail纹理标志
	GLint m_iRepeatDetailTexture;		// detail纹理重复次数
	ImageLoad m_DetailTexture;			// detail纹理对象

	// 照明数据成员
	IlluminationType m_IlluminationType;// 使用的照明类型
	Vector3 m_vecIlluminationColor;		// 简单基于高度的照明颜色
	GLubyte *m_pIlluminationData;		// 照明图数据
	GLint m_iIlluminationMapSize;		// 照明图尺寸

	// 生成照明图的相关参数成员
	GLfloat m_fMinBrightness;	// 照明最小和最大亮度
	GLfloat m_fMaxBrightness;	
	GLfloat m_fIlluminationSoftness;	// 照明柔和度
	GLint m_iDirectionX;		// 照明方向(相对于高度图的方向)
	GLint m_iDirectionZ;	

private:

	// 私有操作
	// 屏蔽掉复制控制函数
	HeightMap(const HeightMap &rhs);
	HeightMap &operator =(const HeightMap &rhs);

	// 将值规范在范围内
	GLfloat StandardizationValue(GLfloat value)
	{
		if (value > 255.0f)
		{
			value = 255.0f;
		}
		else if (value < 0.0f)
		{
			value = 0.0f;
		}
		return value;
	}

	// 规范化地形高度值到0 -- 255的范围内
	GLboolean NormalizeTerrain(GLfloat *heightData);

	// 为使用Fault Formation算法生成"部分"地形进行过滤融合
	GLvoid FilterHeightArea(GLfloat* heightData, GLint stride, GLuint count, GLfloat filter);

	// 以各个方向对整个地形进行过滤融合
	GLvoid FilterHeightField(GLfloat *heightData, GLfloat filter);

	// 得到指定纹理砖瓦的纹理坐标
	GLvoid GetTileTexCoord(ImageLoad *pTexture, GLint &x, GLint &y);

	// 对计算地形纹理坐标对应的高度图上的差值后的高
	// 度值,解除了地形纹理尺寸对高度图尺寸的依赖性
	GLubyte InterpolateHeight(GLint x, GLint z, GLfloat ratio);

	// 根据指定的地形高度值提取此纹理砖瓦的颜色贡献百分比
	GLfloat CalulateContributionPercent(GLint tileIndex, GLubyte height);

};

#endif

⌨️ 快捷键说明

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