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

📄 bruteforce.cpp

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

//---------------------------------------
// 函数名称:BruteForce::Render - public
// 描述:绘制高度图
// 参数:None
// 返回:None
//---------------------------------------
GLvoid BruteForce::Render() const
{
	// 检测此类对象中是否保存有高度图
	if (m_pHeightData == NULL)
	{
		// 错误信息:不存在任何高度图
		return;
	}

	// 基于斜坡的光浩地形算法描述:即根据预先设置的光照
	// 方向(相对于高度图的x和z方向),光照柔和度和最小最
	// 大被照明度计算出高度图中每个顶点的受光度或被照明
	// 度, 
	// 关键原理代码:fShadeProportion = 1.0f - ( GetHeightAtPoint(x - m_iDirectionX, z - m_iDirectionZ) - GetHeightAtPoint(x, z) )/m_fIlluminationSoftness; 
	// m_fIlluminationSoftness表示求在光照方向上当前顶
	// 点与上一个顶点的高度差,而m_fIlluminationSoftness
	// 表示光照的柔和度也可间接表示了虚拟光源相对于地形
	// 表面的高度,m_fLightSoftness越大表示光照距地形表
	// 面较高,m_fLightSoftness越小表示光照距地形表面较
	// 低,将1.0f减去高度差与m_fLightSoftnes相除后的结果
	// 即表示此顶点在此方向虚拟光源的受光量或被照明度.此
	// 算法存在一个缺点,即虚拟光源方向的移动间隔只为45度,
	// 也就是说不能平滑的移动虚拟光源的方向.

	// 基于光照图的光照地形算法描述:即根据载入的光照图
	// 的数据,将与高度图对应的光照图顶点与预先设置的照
	// 明颜色进行交互,以计算此高度顶点受到的光照量,实际
	// 上并不存在真正的光源,只是用户预先设置的照明颜色
	// 而已.有一点需要注意的是载入的光照图尺寸最后与高
	// 度图尺寸相同,否则则需要进行对每个高度图顶点进行
	// 光照差值计算.

	// 基于简单高度的光照地形算法描述:即利用地形各顶点
	// 的高度作为此顶点所受光照量大小的依据,高度值低的
	// 顶点颜色较暗,高度值高的顶点颜色较亮,将顶点所对应
	// 的高度值(被认为是地形的灰度颜色值)与预先设置的光
	// 照颜色相乘以得到光照与顶点高度值的交互,其实场景
	// 中并不存在所谓的光源之类的,预先设置的光照只不过
	// 是用户设置的颜色值而已.此地形光照的优点是实现比较
	// 简单,缺点是忽略了光照相对于各顶点的位置,不够真实.
	// 有一点需要注意的是:此处纹理单元0的纹理环境参数必
	// 须为GL_MODULATE,以将光照后的颜色与地形纹理颜色进
	// 行混合.

	// detail地形纹理算法描述:在程序中生成地形纹理的
	// 基础上使用多重纹理以增加地形纹理的细节,此增加的
	// 另一层纹理则往往是一些龟裂或泥尘的纹理图,其中存
	// 在有一个变量--重复次数,代表此层纹理在整个地形纹
	// 理中重复次数和细致程序,其本质即是在整个地形纹理
	// 图中进行循环重复贴图并与地形混合纹理进行混合.
	
	// 因为这里只是将较为平均的detail纹
	// 理与底层纹理进行混合,所以是否纹理
	// 进行翻转并不重要

	// 禁止被面剔除
	glDisable(GL_CULL_FACE);	

	// 为SDL载入的纹理设置纹理矩阵
	//glMatrixMode(GL_TEXTURE);
	//glPushMatrix(); 
	//glRotatef(180.0f, 0.0f, 0.0f, 1.0f);
	//glScalef(-1.0f,1.0f,1.0f);
	//glMatrixMode(GL_MODELVIEW);

	// 设置纹理单元0
	glActiveTextureARB(GL_TEXTURE0_ARB);
	glEnable(GL_TEXTURE_2D);
	glBindTexture(GL_TEXTURE_2D, m_uiTerrainTextureID);
	glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);	// 设置纹理环境

	// 设置纹理单元1
	glActiveTextureARB(GL_TEXTURE1_ARB);
	glEnable(GL_TEXTURE_2D);
	glBindTexture(GL_TEXTURE_2D, m_DetailTexture.GetTextureID());
	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
	glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 2);

	// 临时变量
	GLubyte ubIlluminationDegree;	// 照明值
	GLfloat fTexLeft, fTexBottom, fTexTop;	// 地形的纹理坐标

	// 循环遍历每一行绘制高度图地形
	for(GLint z = 0; z < m_iHeightMapSize - 1; ++z)
	{
		// 逐行绘制三角形网格地形带
		glBegin(GL_TRIANGLE_STRIP);

			// 顶点以上下上下的顺序进行绘制
			for(GLint x = 0; x < m_iHeightMapSize; ++x )
			{
				// 计算地形顶点的纹理坐标
				fTexLeft = static_cast<GLfloat> (x)/m_iHeightMapSize;
				fTexBottom = static_cast<GLfloat> (z)/m_iHeightMapSize;
				fTexTop	= static_cast<GLfloat> (z + 1)/m_iHeightMapSize;

				// 得到此顶点的灰度级颜色
				ubIlluminationDegree = GetIlluminationDegreeAtPoint(x, z);		
				// 根据该点受的:光照"设置绘制颜色
				glColor3ub(ubIlluminationDegree*m_vecIlluminationColor.x, 
				ubIlluminationDegree*m_vecIlluminationColor.y, ubIlluminationDegree*m_vecIlluminationColor.z);	
				//glTexCoord2f(fTexLeft, fTexBottom);		// 设置地形顶点纹理坐标
				glMultiTexCoord2fARB( GL_TEXTURE0_ARB, fTexLeft, fTexBottom );
				if (m_bEnableDetailTexture == GL_TRUE)
				{
					glMultiTexCoord2fARB( GL_TEXTURE1_ARB, fTexLeft*m_iRepeatDetailTexture, fTexBottom*m_iRepeatDetailTexture );
				}
				glVertex3f(static_cast<GLfloat> (x), GetScaleHeightAtPoint(x, z), static_cast<GLfloat> (z));

				ubIlluminationDegree = GetIlluminationDegreeAtPoint(x, z + 1);
				glColor3ub(ubIlluminationDegree*m_vecIlluminationColor.x, 
				ubIlluminationDegree*m_vecIlluminationColor.y, ubIlluminationDegree*m_vecIlluminationColor.z);
				//glTexCoord2f(fTexLeft, fTexTop);		// 设置地形顶点纹理坐标
				glMultiTexCoord2fARB( GL_TEXTURE0_ARB, fTexLeft, fTexTop );
				if (m_bEnableDetailTexture == GL_TRUE)
				{
					glMultiTexCoord2fARB( GL_TEXTURE1_ARB, fTexLeft*m_iRepeatDetailTexture, fTexTop*m_iRepeatDetailTexture );
				}
				glVertex3f(static_cast<GLfloat> (x), GetScaleHeightAtPoint(x, z + 1), static_cast<GLfloat> (z + 1));
			}

		glEnd();
	}
	
	// 恢复纹理矩阵
	//glMatrixMode(GL_TEXTURE);
	//glPopMatrix();
	//glMatrixMode(GL_MODELVIEW);

	// 释放纹理单元1的绑定
	glActiveTextureARB(GL_TEXTURE1_ARB);
	glDisable(GL_TEXTURE_2D);
	glBindTexture( GL_TEXTURE_2D, NULL);

	// 释放纹理单元0的绑定
	glActiveTextureARB(GL_TEXTURE0_ARB);
	glDisable(GL_TEXTURE_2D);
	glBindTexture(GL_TEXTURE_2D, NULL);
	// 启动被面剔除
	glEnable(GL_CULL_FACE);	
}

⌨️ 快捷键说明

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