glTexParameter

函数原型:

       void glTexParameterf(GLenum target,GLenum pname, GLfloat param)

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

参数说明:

  • target: 指定目标纹理,它只能取值GL_TEXTURE_1D或者GL_TEXTURE_2D;
  • pname:指定单值纹理参数的符号名称,可以选择的符号常数如下:GL_TEXTURE_MIN_FILTER、                                                                                                                                         GL_TEXTURE_MAG_FILTER、
  •                                                                                                 GL_TEXTURE_WRAP_S、  
  •                                                                                                 GL_TEXTURE_WRAP_T;
  • param:指定pname的值

函数说明:

       图象从纹理图象空间映射到帧缓冲图象空间(映射需要重新构造纹理图像,这样就会造成应用到多边形上的图像失真),这时就可用glTexParmeteri()函数来确定如何把纹理象素映射成像素.

案例:

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
        GL_TEXTURE_2D: 操作2D纹理.
        GL_TEXTURE_WRAP_S: S方向上的贴图模式.
        GL_CLAMP: 将纹理坐标限制在0.0,1.0的范围之内.如果超出了会如何呢.不会错误,只是会边缘拉伸填充.

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
        这里同上,只是它是T方向

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    这是纹理过滤
        GL_TEXTURE_MAG_FILTER: 放大过滤
        GL_LINEAR: 线性过滤, 使用距离当前渲染像素中心最近的4个纹素加权平均值.

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
        GL_TEXTURE_MIN_FILTER: 缩小过滤
        GL_LINEAR_MIPMAP_NEAREST: 

                   使用GL_NEAREST对最接近当前多边形的解析度的两个层级贴图进行采样,然后用这两个值进行线性插值.

注:
      GL_LINEAR使用了线性滤波的纹理贴图。这需要机器有相当高的处理能力,但它们看起来很不错。

      GL_NEAREST从原理上讲,这种方式没有真正进行滤波。它只占用很小的处理能力,看起来也很差。唯一的好处是这样我们的工程在很快和很慢的机器上都可以正常运行。
       我们在 GL_TEXTURE_MIN_FILTER和 GL_TEXTURE_MAG_FILTER时你可以混合使用 GL_NEAREST 和 GL_LINEAR。纹理看起来效果会好些,如果我们更关心速度,可以全采用低质量贴图。

       GL_TEXTURE_MIN_FILTER在图像绘制时小于贴图的原始尺寸时采用。GL_TEXTURE_MAG_FILTER在图像绘制时大于贴图的原始尺寸时采用

            

        上图分别是使用线性滤波和接近滤波进行的纹理映射效果

         // 线形滤波
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);           

        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 

        // 接近滤波
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);          

        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);

 



-------------------------------------------------------------------

另附:

 滤波  
一般来说,纹理图像为正方形或长方形。但当它映射到一个多边形或曲面上并变换到屏幕坐标时,纹理的单个纹素很少对应于屏幕 图像上的象素。根据所用变换和所用纹理映射,屏幕上单个象素可以对应于一个纹素的一小部分(即放大)或一大批纹素(即缩小)。下面用函数 glTexParameter*()说明放大和缩小的方法:

 

 glTexParameter *( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_NEAREST );
glTexParameter *( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_NEAREST );

第一个参数可以是GL_TEXTURE_1D或GL_TEXTURE_2D,即表明所用的纹理是一维的还是二维的;
第二个参数指定滤波方法 ,其中参数值GL_TEXTURE_MAG_FILTER指定为放大滤波方法,GL_TEXTURE_MIN_FILTER指定为缩小滤波方法;
第三个参数说 明滤波方式, 若选择GL_NEAREST则采用坐标最靠近象素中心的纹素,这有可能使图像走样;若选择GL_LINEAR则采用最
靠近象素中心的四个象素的加权平均值。GL_NEAREST所需计算比GL_LINEAR要少,因而执行得更快,但 GL_LINEAR提供了比较光滑的效果。
参考:http://blog.chinaunix.net/uid-20638550-id-1909184.html
 

 

gl . glTexParameterx ( GL_TEXTURE_2D ,  GL_TEXTURE_MIN_FILTER ,  GL10 . GL_LINEAR );
gl . glTexParameterx ( GL_TEXTURE_2D ,  GL_TEXTURE_MAG_FILTER ,  GL10 . GL_LINEAR );
 
 超出视图范围的重复方式,设置如下参数GL10.GL_CLAMP_TO_EDGE:重复边沿的像素;如果设置成GL10.GL_REPEAT:纹理重复。
参考:http://edu.gamfe.com/tutor/d/28604.html
 

 

gl . glTexParameterx ( GL_TEXTURE_2D ,  GL_TEXTURE_WRAP_S ,  GL10 . GL_CLAMP_TO_EDGE );
gl . glTexParameterx ( GL_TEXTURE_2D ,  GL_TEXTURE_WRAP_T ,  GL10 . GL_CLAMP_TO_EDGE );



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenGL ES中,纹理数组是一组纹理的集合,可以一次性加载多个纹理并进行处理。使用纹理数组可以提高渲染效率,减少内存占用。 纹理数组的创建和使用主要有以下几个步骤: 1. 创建纹理数组对象:使用glGenTextures函数创建纹理数组对象,并使用glBindTexture函数绑定到OpenGL ES上下文中。 2. 加载纹理数据:使用glTexImage2D函数将纹理数据加载到纹理数组中。 3. 设置纹理参数:使用glTexParameter函数设置纹理参数,如过滤模式、纹理环绕模式等。 4. 绑定纹理数组:使用glBindTexture函数将纹理数组绑定到OpenGL ES上下文中。 5. 使用纹理数组:在渲染时,使用glActiveTexture函数激活纹理单元,并使用glBindTexture函数将纹理数组绑定到激活的纹理单元上,然后在着色器中使用sampler2DArray类型的变量进行采样。 需要注意的是,在使用纹理数组时,每个纹理的大小和格式必须相同。 下面是一个使用纹理数组的示例代码: ``` GLuint texArray; glGenTextures(1, &texArray); glBindTexture(GL_TEXTURE_2D_ARRAY, texArray); glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, width, height, numTextures, 0, GL_RGBA, GL_UNSIGNED_BYTE, texData); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D_ARRAY, texArray); glUniform1i(textureLoc, 0); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值