本案例主要目的多个纹理如何使用,加深对纹理的使用的理解。
整体的案例效果如图所示
其中main、ChangeSize、ShutdownRC就不多作说明,
主要分为三部分,着重讲下生成纹理和设置隧道数据
生成纹理
生成纹理有两部分
//参数1:纹理个数
//参数2:纹理数组
glGenTextures(TEXTURE_COUNT, textures);
bind --> readTGA --> texParameter --> texImage --> generateMip --> free
glBindTexture
gltReadTGABits
glTexParameteri
glTexImage2D
glGenerateMipmap
//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个点的顶点及纹理坐标,
MultiTexCoord2f
,其中第一个参数是指图层,即纹理的level
,一般默认设置为0,后两个参数即为纹理的坐标s、t
Vertex3f
,传入顶点的x、y、z
shaderManager.UseStockShader(GLT_SHADER_TEXTURE_REPLACE, transformPipeline.GetModelViewProjectionMatrix(), 0);
函数功能比较简单,主要就是根据上下键位,记录移动的深度值,并重新渲染
这个函数是鼠标右键的相应回调函数,根据鼠标右键的菜单选择,对所有纹理进行过滤方式的设置,这也是为什么使用for循环设置的原因,因为有多个纹理,需要设置多次,且在设置前,需要重新绑定纹理,主要流程图如下
其中主要是几种过滤方式的在项目中的显示效果
完整的代码见github - 08_OpenGL_隧道