美文网首页iOS视觉
十六 案例:隧道(纹理添加)

十六 案例:隧道(纹理添加)

作者: 王俏 | 来源:发表于2020-08-05 09:01 被阅读0次

    隧道案例

    1. 效果图

    image

    2. 实现分析

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

    image
    image
    image
    image

    3. 代码实现流程

    3.1 SetupRC函数

    1)设置背景颜色 glClearColor

    2)初始化着色器管理器

    3)shaderManager.InitializeStockShaders();

    4)初始化3个纹理(顶面+侧面+地面)
    初始化纹理流程

    image
    • 分配纹理对象(glGenTextures)并进行纹理textureID绑定(glBindTexture)
    • 设置纹理参数glTexParameteri(过滤方式和环绕模式)
    • 读取纹理数据gltReadTGABits(GLbyte *pBits; int nWidth, nHeight, nComponents; GLenum eFormat;)
    • 使用完释放pBits free(pBits);
    • 生成Mip贴图(glGenerateMipmap)
    • 载入纹理 glTexImage2D
    image

    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

    4. 完整代码实现 https://github.com/wq89816/TheTunnel

    相关文章

      网友评论

        本文标题:十六 案例:隧道(纹理添加)

        本文链接:https://www.haomeiwen.com/subject/ecgwrktx.html