OpenGL 纹理

摘自《OpenGL游戏程序设计》

 

      当一个纹理映射到一个多边形上时,纹理就将随着此多边形的变换而进行相应的变换。纹理映射可以被认为是赋给了3D物体或多边形的一种皮肤。可以在物体上移动、拉伸或者压缩这个皮肤,但无论何种情况下,这个皮肤或者说纹理图总是不会与其所应用的多边形分离的。

      将纹理数据从一个文件中载入内存之后,需要将其定义为一个OpenGL纹理图,而纹理图的维数决定了应该使用哪个函数来完成此定义。

      纹理对象是用来存储纹理数据的,使其随时准备被使用。包括纹理名字的生成和纹理对象的创建和使用。

      由于纹理图被应用于变形多边形后,将会发生扭曲变形,一个单一像素可能仅仅代表此纹理图的一个纹素(texel)的一小部分,也可能代表多个纹素的集合。这时,就要使用纹理过滤来告诉OpenGL应该如何计算这些像素和纹素,以得到最后的图像。

      在纹理过滤处理中,放大是指用一个像素来表示一个纹素的一小部分,而缩小则是指用一个像素表示多个纹素的集合。可以通过调用glTexParameteri()函数来通知OpenGL想要如何处理这两种过滤方式。

      void glTexParameteri( GLenum target , GLenum pname , GLint param ) ;

      相应于放大和缩小过滤处理,pname 参数分别等于GL_TEXTURE_MAG_FILTER和GL_TEXTURE_MIN_FILTER。

 

      同颜色的混合一样,OpenGL也允许通过纹理模式来指定纹理图颜色的处理。对于每个纹理,可以调用glTexEnvi()函数从四个纹理模式中进行选择。

      当实际绘制场景时,必须指定每个顶点的纹理坐标。纹理坐标用于确定纹理图的每个纹素对应于物体的哪个部分。纹理坐标(0,0)指的是一个纹理的左下角,而纹理坐标(1,1)则是指纹理的右上角。

      当指定了0~1范围之外的纹理坐标时,可以告诉OpenGL对于纹理图或者重复其纹理坐标或者夹持其纹理坐标。如果将纹理坐标设置为(2.0,2.0),那么此纹理将会被重复四次。如果为(1.0,2.0),则在t方向上重复2次,在s方向上正常。

      而夹持处理则将大于1.0的纹理坐标设为1.0,小于0.0的为0.0。那么又应该如何通知OpenGL是要进行重复处理还是夹持处理呢?可以调用glTexParameter()函数,不过这次函数中pname参数应取GL_TEXTURE_WRAP_S   GL_TEXTURE_WRAP_T,前者s表示方向,后者表示t方向。

      重复处理:GL_REPEAT

      夹持处理:GL_CLAMP      GL_CLAMP_TD_EDGE(当纹理存在边界并希望OpenGL忽略边界时,使用后者)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值