OpenGL:纹理隧道

2020-08-09  本文已影响0人  源本平凡

本案例主要目的多个纹理如何使用,加深对纹理的使用的理解。

整体的案例效果如图所示

下面接着说说隧道的绘制过程,整体的流程图如下:

其中main、ChangeSize、ShutdownRC就不多作说明。

SetupRC函数

主要分为三部分,着重讲下生成纹理和设置隧道数据

函数流程图如下:

生成纹理

生成纹理有两部分

//参数1:纹理个数
//参数2:纹理数组
glGenTextures(TEXTURE_COUNT, textures);
//4、循环设置纹理数组的纹理参数
   for (iLoop = 0; iLoop < TEXTURE_COUNT; iLoop++) {
       /**绑定纹理对象 glBindTexture
       参数1:纹理模式,GL_TEXTURE_1D,GL_TEXTURE_2D,GL_TEXTURE_3D
       参数2:需要绑定的纹理对象
       */
       glBindTexture(GL_TEXTURE_2D, textures[iLoop]);
       
       /**加载tga文件
       参数1:纹理文件名称
       参数2:文件宽度变量地址
       参数3:文件高度变量地址
       参数4:文件组件变量地址
       参数5:文件格式变量地址
       返回值:pBytes,指向图像数据的指针
       */
       pBytes = gltReadTGABits(szTextureFiles[iLoop], &iWidth, &iHeight, &iComponents, &eFormat);
       
       //加载纹理、设置过滤器和包装模式
       //GL_TEXTURE_MAG_FILTER(放大过滤器,GL_NEAREST(最邻近过滤)
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
       //GL_TEXTURE_MIN_FILTER(缩小过滤器),GL_NEAREST(最邻近过滤)
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
       //GL_TEXTURE_WRAP_S(s轴环绕),GL_CLAMP_TO_EDGE(环绕模式强制对范围之外的纹理坐标沿着合法的纹理单元的最后一行或一列进行采样)
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
       //GL_TEXTURE_WRAP_T(t轴环绕),GL_CLAMP_TO_EDGE(环绕模式强制对范围之外的纹理坐标沿着合法的纹理单元的最后一行或一列进行采样)
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
       
       /**载入纹理 glTexImage2D
       参数1:纹理维度,GL_TEXTURE_2D
       参数2:mip贴图层次
       参数3:纹理单元存储的颜色成分(从读取像素图中获得)
       参数4:加载纹理宽度
       参数5:加载纹理的高度
       参数6:加载纹理的深度
       参数7:像素数据的数据类型,GL_UNSIGNED_BYTE无符号整型
       参数8:指向纹理图像数据的指针
       */
       glTexImage2D(GL_TEXTURE_2D, 0, iComponents, iWidth, iHeight, 0, eFormat, GL_UNSIGNED_BYTE, pBytes);
       
       //生成mip贴图
       glGenerateMipmap(GL_TEXTURE_2D);
       
       free(pBytes);
   }

设置隧道数据

其实这部分的重点主要是隧道顶点坐标纹理的映射,只要把这部分理清楚了,就非常简单了,隧道的顶点坐标如图所示:

与4个面相对应的纹理坐标如图所示

4个面均是由多个三角形使用三角形带的图元连接方式组成,所以需要使用for循环,每次设置4个点的顶点及纹理坐标。

RenderScene函数

函数的流程图如下

shaderManager.UseStockShader(GLT_SHADER_TEXTURE_REPLACE, transformPipeline.GetModelViewProjectionMatrix(), 0);

SpecialKeys函数

函数功能比较简单,主要就是根据上下键位,记录移动的深度值,并重新渲染。

ProcessMenu函数

这个函数是鼠标右键的相应回调函数,根据鼠标右键的菜单选择,对所有纹理进行过滤方式的设置,这也是为什么使用for循环设置的原因,因为有多个纹理,需要设置多次,且在设置前,需要重新绑定纹理,主要流程图如下:

其中主要是几种过滤方式的在项目中的显示效果

上一篇 下一篇

猜你喜欢

热点阅读