代码改变世界

纹理 放大缩小过滤

2012-12-06 15:10  三戒1993  阅读(358)  评论(0编辑  收藏  举报
在iOS系统中的OpenGL ES教程11 glTexParameter功能,让涉足更深一点。件,可以设置作为一个功能glTexParameter GL_TEXTURE_MIN_FILTER GL_TEXTURE_MAG_FILTER GL_TEXTURE_WRAP_S GL_TEXTURE_WRAP_T,GL_GENERATE_MIPMAP。此产品是什么意思?对这个问题的回答是理解函数glTexParameter

 

纹理映射是映射到二维图像的三维几何形状的任务。教程10侧中的三维深度和曲率,因为二维图像的三维几何1:1像素映射中不能有 因此,如何导入任何像素将被映射到从一个二维图像的三维几何形状所需要的是一种方法 该采样函数是设置方法,在两维图像中的像素的采样所需的三维几何函数glTexParameter 抽样方法和优化的采样glTexParameter功能的方法。

 

GL_TEXTURE_MIN_FILTER和GL_TEXTURE_MAG_FILTER

作为三维几何纹理映射的二维图像,例如,即使大小不同,这取决于对深度的三维几何形状。极大地在屏幕上,显示在屏幕上,从远处看起来更小。


 站得高,看得远,主要是在广场附近的小矩形,如上图所示。1:1 2D图像的映射,如果将发生的特定的空白矩形附近和远离的正方形像素结块。这将带来的任何部分的图像像素,放大和缩小,这取决于选择GL_TEXTURE_MIN_FILTER的几何形状和GL_TEXTURE_MAG_FILTER。

 

GL_TEXTURE_MIN_FILTER


(多边形)的几何形状的纹理(S)是小于的T坐标的图像中提取的数据被施加到二维图像GL_TEXTURE_MIN_FILTER节目。的17倍,通过选择最接近的纹理的像素的像素值GL_TEXTURE_MIN_FILTER GL_NEAREST GL_LINEAR,17,18,12,13,该象素的平均值的几何形状上的红点上的焦点。


GL_TEXTURE_MAG_FILTER


中示出上述的几何纹理大于的GL_TEXTURE_MAG_FILTER 使用10倍的像素最近的纹理的像素值GL_TEXTURE_MAG_FILTER GL_NEAREST GL_LINEAR,13,14,9,10,该象素的平均值的几何形状上的红点,和聚焦。

 

修改方法如下:打开的的文件OGLTexture.m generateTexture方法。

  1. - (BOOL )generateTexture  
  2. {  
  3.     ...  
  4.     / /设置纹理参数  
  5.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST)的;  
  6.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST)的;  
  7.     ...  
  8.     返回 YES ;  
  9. }  

当你编译并运行发生严重走样,如左图所示,你可以看到的结果。轻轻产生的价值GL_LINEAR如果你运行给右图所示的结果。

GL_NEAREST

GL_LINEAR


并不总是GL_TEXTURE_MIN_FILTER和GL_TEXTURE_MAG_FILTER将被设置到相同的值。倒塌时,您可以使用别名时显着放大相关,所以使用GL_NEAREST轻轻地来GL_LINEAR 

  1. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST)的;  
  2. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);  


 

GL_TEXTURE_WRAP_S和GL_TEXTURE_WRAP_T

10路在(u,v)或(S,T)坐标的范围为[0.0,1.0]。超出此范围,但如果你设置当你导入的任何部分的图像的像素呢?在这种情况下,采样方法可以设置到GL_TEXTURE_WRAP_S和GL_TEXTURE_WRAP_T 重复再重复的GL_REPEAT边界值)或图像(图像本身(GL_CLAMP_TO_EDGE)的设置之一。会通过实例学习的差异。

 

修改方法如下:打开的的文件OGLTexture.m generateTexture方法。

  1. - (BOOL )generateTexture  
  2. {  
  3.     ...  
  4.     / /设置纹理参数  
  5.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);  
  6.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);  
  7.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT)的;  
  8.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE)的;  
  9.     ...  
  10.     返回 YES ;  
  11. }  

以上代码的水平范围内(S)超过[0.0,1.0],图像重复自己,和垂直范围(t)[0.0,1.0]重复的值超过设置的图像的边界。

 

开放TextureMappedPolygonView.m文件内容如下:设置纹理坐标。

  1. 和GLfloat verticesForGL_TRIANGLE_STRIP [] = {  
  2.     0.2,1.05,0.0,           / / V1  
  3.     0.0,2.0,                 / / UV1  
  4.      
  5.     0.2,0.45,0.0,           / / V2  
  6.     0.0,0.0,                 / / UV2  
  7.      
  8.     0.8,1.05,0.0,           / / V3  
  9.     3.5,3.0,2.0,2.0,                 / / UV3  
  10.      
  11.     0.8,0.45,0.0,           / / V4  
  12.     3.5,3.0,2.0,0.0,                 / / UV4  
  13. };  

当你编译并运行,你可以看到下面的结果。


下面的水平,垂直,所有给定的运行的结果相同的值。

GL_REPEAT

GL_CLAMP_TO_EDGE


 

GL_GENERATE_MIPMAP

mipmap的快速渲染,创建纹理的许多蜜蜂。欲了解更多信息的mipmap,可以发现维基百科(http://en.wikipedia.org/wiki/Mipmap)。当您使用的图像尺寸64×64,32×32,16×16,8×8,4×4,×1大小的图像生成Mipmap。64x64的纹理映射的三维图像几何距离在屏幕上,如果你有一个4x4大小的4×4纹理映射图像会更快和更有效的。当使用设置为在GL_TEXTURE_MIN_FILTER值的Mipmap四个将被添加。


  • 最近GL_NEAREST_MIPMAP_NEAREST mipmap纹理相似,大小到当前像素提取方法

  • 线性方法GL_LINEAR_MIPMAP_NEAREST mipmap纹理大小相似,当前选中的像素提取

  • 然后两个mipmap纹理的尺寸类似于当前GL_NEAREST_MIPMAP_LINEAR 使用的象素值,然后取从每个的mipmap NEAREST提取的两个像素的平均

  • 两个mipmap纹理的尺寸类似于当前GL_LINEAR_MIPMAP_LINEAR 然后采取两种方式中使用的像素值的平均线性像素提取从每个的mipmap

 

并激活使用的mipmap如下:GL_TEXTURE_MIN_FILTER GL_LINEAR_MIPMAP_LINEAR设定值。

 

  1. - (BOOL )generateTexture  
  2. {  
  3.     ...  
  4.     / /设置纹理参数  
  5.     glTexParameteri(GL_TEXTURE_2D,GL_GENERATE_MIPMAP,GL_TRUE)的;  
  6.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR)的;  
  7.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);  
  8.     ...  
  9.     返回 YES ;  
  10. }  

 

要使用mipmap的glScalef RenderView方法使用多边形折叠(不包括转换mipmap的申请使用。)

  1. - (无效)的RenderView  
  2. {  
  3.     / /擦除的黑色背景  
  4.     glClearColor(0.0,0.0,0.0,1.0);  
  5.     glClear(GL_COLOR_BUFFER_BIT);  
  6.      
  7.     模型 - 视图矩阵的/ /矩阵模式的改变  
  8.     glMatrixMode(GL_MODELVIEW);  
  9.     / /初始化模型视图矩阵:  
  10.     调用glLoadIdentity();  
  11.      
  12.     / / MIPMAP的测试  
  13.     glScalef(0.3,0.3,1.0);  
  14.      
  15.     ...  
  16. }  

 

运行,改变设置,可以通过以下方式获得以下结果。图片是小和分钟,但你仔细看,你可以看到,白线表示略有不同。

GL_NEAREST_MIPMAP_NEAREST

GL_LINEAR_MIPMAP_NEAREST

GL_NEAREST_MIPMAP_LINEAR


GL_LINEAR_MIPMAP_LINEAR

 

纹理贴图的基础上,从下一次我完成的部分,我将介绍三维几何表示。纹理先进的discussed'll ^ ^谢谢你抽出时间来阅读长篇的文章。