📄 bruteforce.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 + -