美文网首页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

相关文章

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

    隧道案例 1. 效果图 2. 实现分析 实际上是在一个黑背景上绘制了四个面(两个侧面+地面+顶面) 3. 代码实现...

  • 案例分析4:纹理隧道

    本案例主要目的多个纹理如何使用,加深对纹理的使用的理解。案例效果如下 对应代码地址纹理隧道。 下面接着说说隧道的绘...

  • OpenGL 纹理隧道案例

    隧道示例程序使用了和纹理有关的内容,并在视觉上显示了不同的过滤器和贴图模式。 该示例程序在启动时加载3个纹理用于对...

  • OpenGL 纹理案例-隧道

    在学习了纹理之后,我们尝试着用纹理来实现一个类似于下图这样的隧道效果,并且让他可以通过键盘的上下键可以来进行前进和...

  • OpenGL纹理案例-隧道

    使用OpenGL常用的API,绘制一个简单的隧道模型并贴图。最终下过如下: 完成代码: #include "GLT...

  • OpenGL纹理案例-隧道

    OpenGL纹理案例-隧道 之前我写过一些关于纹理的一些基本API和API的方法参数的解释,现在我们来弄一个隧道案...

  • OpenGL纹理坐标&&隧道案例(二)

    一.隧道案例效果 二.纹理坐标 纹理坐标主要是把图形映射到OpenGL中去,图形中每个顶点关联到对应的纹理坐标下,...

  • 案例4——纹理绘制隧道

    整体的效果图如下: 基本流程基本不变,主要介绍下案列的特点 其中main、ChangeSize、ShutdownR...

  • OpenGL:纹理隧道

    本案例主要目的多个纹理如何使用,加深对纹理的使用的理解。 整体的案例效果如图所示 下面接着说说隧道的绘制过程,整体...

  • OpenGL案例07:隧道

    本案例主要目的多个纹理如何使用,加深对纹理的使用的理解。 整体的案例效果如图所示 下面接着说说隧道的绘制过程,整体...

网友评论

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

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