OpenGL案例:隧道(纹理添加)

826 阅读1分钟

隧道案例

1. 效果图

2. 实现分析

实际上是在一个黑背景上绘制了四个面(两个侧面+地面+顶面)

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->配置纹理替换矩阵着色器->绘制图像

4. 完整代码实现 github.com/wq89816/The…