OpenGL超级宝典笔记5
第八章 基本纹理贴图
学习如何加载纹理对象以及如何使用纹理坐标把图像贴图到几何图形的顶点。还学习对纹理图像进行过滤以及与几何图形颜色值进行混合的不同方法,并学习如何使用mip贴图来提高性能和改善视觉精度。讨论如何管理多个纹理以及如何在它们之间进行快速和方便的切换,并告诉OpenGL在可以使用高性能的纹理内存时哪个纹理具有更高的优先级。
a) 加载纹理 通过glTextImage根函数加载一维、二维和三维纹理贴图,所加载的纹理数据将经历和前一章所描述的像素和图像处理管线相同的过程。将纹理贴图到几何图形,需要为每个顶点指定一个纹理坐标(texture coordinate)。一般情况下,纹理坐标被指定为浮点数,范围从0.0到1.0,用s,t,r和q。q是缩放因子。函数:void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r);
b) 纹理环境 通过glTexEnv函数把来自纹理单元的颜色与底层几何颜色进行组合。通过纹理环境模式来控制,包括GL_MODULATE调整、GL_REPLACE替换、GL_DECAL贴花、GL_BLEND混合、GL_ADD添加。
c) 纹理参数 在应用纹理贴图时,有许多参数可以影响纹理贴图的渲染规则和行为。纹理参数都是通过glTexParameter函数的各种变型进行设置的。基本过滤,通过一个拉伸或收缩的纹理贴图计算颜色片段的过程就是纹理过滤,有放大缩小过滤器,最邻近过滤和线性过滤。
d) Mip贴图是一种功能强大的纹理技巧,它不仅可以提高渲染性能,而且可以改善场景的显示质量。使用标准纹理贴图处理两个常见的问题,从而实现以上目标。第一个问题是闪烁(scintillation)的效果,第二个问题更多地和性能有关,但它的原因和闪烁相同。问题根源在于它加载了大量的纹理内存并对它们进行了过滤处理,但屏幕上实际显示的只是很少的一部分片段。解决办法就是用mip贴图,把一系列从最大到最小的图像加载到单个“mip贴图”纹理状态。然后,OpenGL使用一组新的过滤模式,为一个特定的几何图形选择具有最佳过滤效果的纹理。
第九章 高级纹理贴图
学习如何通过纹理压缩以及几何图形纹理坐标的自动生成改善纹理过滤的质量,获得更佳的性能和内存效率。还学习如何使用球体贴图实现效果良好的环境贴图,并使用立方图纹理获得更为逼真和精确的反射效果。还有讲述多重纹理和纹理组合器。
a) 辅助颜色 把纹理应用到几何图形时,由于光照的工作方式,常常会导致一种隐蔽的、不尽人意的副作用,解决方案是在纹理贴图之后再应用到镜面亮点,称为辅助镜面颜色。函数如下:glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
b) 纹理压缩 用较小的内存中加载更多的纹理,从而显著地改善纹理处理的性能,这是由于在纹理过滤是减少了纹理交换并使用了更少的内存。压缩纹理,使用glGetTexLevelParameteriv函数(以GL_TEXTURE_COMPRESSED为参数)判断这个纹理是否被成功压缩。加载压缩纹理,用glGetCompressedTexImage函数提取经过压缩的数据并把它保存到磁盘中。
c) 纹理坐标生成 使用glEnable函数,在S、T、R和Q纹理坐标上启用纹理坐标生成。可以用glTexGenf()函数设置用于纹理坐标生成的函数或方法。物体线性贴图,纹理生成模式为GL_OBJECT_LINEAR;视觉线性贴图,纹理生成模式为GL_EYE_LINEAR;球体贴图,纹理生成模式为GL_SPHERE_MAP;立方体贴图,纹理生成模式为GL_REFLECTION_MAP和GL_NORMAL_MAP;
d) 多重纹理,OpenGL硬件实现支持在几何图形上同时应用两个或更多的纹理。多重纹理坐标,使用glMultiTexCoord3f()等函数。纹理组合器允许我们对多重纹理片段的混合方式施加相同的控制,纹理组合器增加了一种新的纹理环境GL_COMBINE,调用函数glTexEnv来控制纹理组合器。