隧道案例
1. 效果图
image2. 实现分析
实际上是在一个黑背景上绘制了四个面(两个侧面+地面+顶面)
imageimage
image
image
3. 代码实现流程
3.1 SetupRC函数
1)设置背景颜色 glClearColor
2)初始化着色器管理器
3)shaderManager.InitializeStockShaders();
4)初始化3个纹理(顶面+侧面+地面)
初始化纹理流程
- 分配纹理对象(glGenTextures)并进行纹理textureID绑定(glBindTexture)
- 设置纹理参数glTexParameteri(过滤方式和环绕模式)
- 读取纹理数据gltReadTGABits(GLbyte *pBits; int nWidth, nHeight, nComponents; GLenum eFormat;)
- 使用完释放pBits free(pBits);
- 生成Mip贴图(glGenerateMipmap)
- 载入纹理 glTexImage2D
5)开启深度测试 glEnable(GL_DEPTH_TEST)
6)用地板批次类设置地板顶点数据和图元组成方式,以及纹理映射关系(MultiTexCoord2f)floorBatch ceilingBatch leftWallBatch rightWallBatch(注意:使用三角形批次类绘制图像时,不需要设置顶点和纹理映射关系,直接配置三角形批次类,使用时进行纹理绑定即可)
floorBatch.Begin(GL_TRIANGLE_STRIP, 28, 1);//7个四边形,每个四边形4个顶点,共28个顶点
//Z表示深度,隧道的深度
for(z = 60.0f; z >= 0.0f; z -=10.0f)
{
floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
floorBatch.Vertex3f(-10.0f, -10.0f, z);
floorBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
floorBatch.Vertex3f(10.0f, -10.0f, z);
floorBatch.MultiTexCoord2f(0, 0.0f, 1.0f);
floorBatch.Vertex3f(-10.0f, -10.0f, z - 10.0f);
floorBatch.MultiTexCoord2f(0, 1.0f, 1.0f);
floorBatch.Vertex3f(10.0f, -10.0f, z - 10.0f);
}
floorBatch.End();
3.2 RenderScene
- 清空颜色缓冲区和深度缓冲区 glClear
- 模型视图堆栈压入栈顶单元矩阵
- 模型视图矩阵Z轴平移viewZ 距离modelViewMatrix.Translate
- 采用纹理替换矩阵着色器 GLT_SHADER_TEXTURE_REPLACE
- 地板纹理绑定glBindTexture(GL_TEXTURE_2D,textures[TEXTURE_FLOOR]);
- 地板绘制floorBatch.Draw();
- 侧面纹理绑定glBindTexture(GL_TEXTURE_2D,textures[TEXTURE_BRICK]);
- 两侧面绘制 leftWallBatch.Draw();rightWallBatch.Draw();
- 顶面纹理绑定glBindTexture(GL_TEXTURE_2D,textures[TEXTURE_CEILING]);
- 地板绘制ceilingBatch.Draw();
- 模型视图堆栈出栈
- 交换缓冲区 glutSwapBuffers();
- 提交重新刷新 glutPostRedisplay()
注意:渲染时绑定纹理流程 glBindTexture->配置纹理替换矩阵着色器->绘制图像
image
网友评论