if (m_bFogMode == FALSE){ // 雾化效果启用切换 m_bFogMode = TRUE; // 启用雾化处理 glEnable(GL_FOG); glFogi(GL_FOG_MODE, GL_LINEAR); // 采用线性变化的雾化效果 GLfloat fogColor[] = {0.8f, 0.8f, 0.8f, 1.0}; // 指定雾化颜色 glFogfv(GL_FOG_COLOR, fogColor); glFogf(GL_FOG_START, 1.0); // 指定按线性变化时计算公式的参量 glFogf(GL_FOG_END, 10000.0); glHint(GL_FOG_HINT, GL_DONT_CARE); //规定雾化效果的质量 }else{ m_bFogMode = FALSE; // 禁用雾化处理 glDisable(GL_FOG); } |
glShadeModel(GL_SMOOTH); // 启用阴影平滑 glEnable(GL_TEXTURE_2D); // 启用纹理映射 glPolygonMode(GL_BACK, GL_FILL); // 后表面以面建模完全填充 glPolygonMode(GL_FRONT, GL_FILL); // 前表面以点建模 AUX_RGBImageRec *TextureImage[1]; // 创建纹理的存储空间 memset(TextureImage, 0, sizeof(void*) * 1); // 清除图像记录,确保其内容为空 TextureImage[0] = auxDIBImageLoad(sPath); // 载入纹理位图并返回指针 glGenTextures(1, &m_nTexture[0]); // 创建纹理 glBindTexture(GL_TEXTURE_2D, m_nTexture[0]); //使用来自位图数据生成的典型纹理 // 生成纹理 glTexImage2D(GL_TEXTURE_2D, // 2D纹理 0, // 图像的详细程度 3, // R,G,B三种数据成分 TextureImage[0]->sizeX, // 纹理的宽度 TextureImage[0]->sizeY, // 纹理的高度 0, // 边框宽度 GL_RGB, // 图像数据由红、绿、蓝三色数据组成 GL_UNSIGNED_BYTE, // 组成图像的数据是无符号字节类型的 TextureImage[0]->data); // 纹理数据的来源 // 缩小得比原始纹理小时采用线形滤波 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // 比放大得原始纹理大时采用线形滤波 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); if (TextureImage[0]) { // 检查纹理是否存在 if (TextureImage[0]->data) {// 检查纹理图像是否存在 free(TextureImage[0]->data); // 释放纹理图像占用的内存 } free(TextureImage[0]); // 释放图像结构 } |
glBindTexture(GL_TEXTURE_2D, m_nTexture[0]); // 选择纹理 float float_x; // 用来将纹理分割成很小的三角网格 float float_y; float float_xb; float float_yb; // 每一个小网格分别映射纹理的对应三角形区域(顺序同地景网格创建顺序) for (int i = 0; i < m_nDemX - 1; i++) { for (int j = 0; j < m_nDemY - 1; j++) { glBegin(GL_TRIANGLE_STRIP); // 开始三角带 float_x = float(i) / float(m_nDemX); float_y = float(j) / float(m_nDemY); float_xb = float(i + 1) / float(m_nDemX); float_yb = float(j + 1) / float(m_nDemY); glTexCoord2f(float_x, float_y); // 第一个纹理坐标 (左下角) glVertex3d(m_pDemX[j * m_nDemX + i], m_pDemY[j * m_nDemX + i], m_pDemH[j * m_nDemX + i]); glTexCoord2f(float_x, float_yb); // 第二个纹理坐标 (左上角) glVertex3d(m_pDemX[(j + 1) * m_nDemX + i], m_pDemY[(j + 1) * m_nDemX + i], m_pDemH[(j + 1) * m_nDemX + i]); glTexCoord2f(float_xb, float_y); // 第三个纹理坐标 (右下角) glVertex3d(m_pDemX[j * m_nDemX + i + 1], m_pDemY[j * m_nDemX + i + 1], m_pDemH[j * m_nDemX + i + 1]); glTexCoord2f(float_xb, float_yb); // 第四个纹理坐标 (右上角) glVertex3d(m_pDemX[(j + 1) * m_nDemX + i + 1], m_pDemY[(j + 1) * m_nDemX + i + 1], m_pDemH[(j + 1) * m_nDemX + i + 1]); glEnd(); // 停止定义三角带 } } } |