纹理过滤:纹理在映射到多边形上并转换成屏幕坐标时,很少使屏幕像素与纹理单元正好一一对应,要么对应一个纹理单元的一小部分(放大),要么对应多个纹理单元(缩小),而控制OpenGL怎样取得纹理值及怎样匀和或插值的,就是纹理过滤方式,分为放大和缩小两方面。
放大的情况的纹理过滤方式有最近点采样和线性采样两种。最近点采样即直接取最近的纹理单元值,这样容易产生锯齿,但它的速度更快;线性采样即取周围2×2的纹理单元取加权平均值,这样通常比较平滑,但是在靠近纹理图像边缘时,采样的2×2纹理可能会包含纹理图像以外的内容(如边框或其他部分的纹理),因此需要注意纹理环绕模式及边框的设置。 即使有MipMap,在放大时也只是用基层的纹理图像。
缩小的情况的纹理过滤方式,除了单纯的最近点采样和线性采样(只使用基层的纹理图像,即使有MipMap),可以采用的的过滤方式可概括为GL_XXX_MIPMAP_XXX,其中XXX为NEAREST或LINEAR,两个XXX分别代表在一层的多个纹理单元间及在多MipMap层间使用怎样的采样方式,其中GL_NEAREST_MIPMAP_NEAREST表示取最靠近的MipMap层的最靠近的纹理单元,GL_LINEAR_MIPMAP_LINEAR又叫双线性过滤。
线性采样和双线性采样能够有效减少因纹理映射引起的锯齿现象,这种锯齿在画面变化的时候尤为突出。
使用gluBuild2DMipmaps代替glTexImage2D创建纹理对象,同时可以自动创建相应的MipMap层。
为了给场景添加光照,使用glLight分别指定光源颜色、光源位置。