GL_TEXTURE_WRAP系列参数的取值

在使用纹理的时候,有时候会出现超过纹理边界的问题,GL_TEXTURE_WRAP系列参数用来设置当这些超出边界时应该怎样处理。下面结合代码和代码产生的结果进行说明每个参数的作用。代码基于红宝书——《opengl编程指南》7th上的代码,自己再稍微改改,用来产生各种效果。

[cpp]  view plain copy
  1. #include "stdafx.h"  
  2. #include <GL/glew.h>  
  3. #include <GL/glut.h>  
  4.   
  5. #define checkImageWidth 64  
  6. #define checkImageHeight 64  
  7.   
  8. static GLubyte checkImage[checkImageHeight][checkImageWidth][4];  
  9.   
  10. static GLuint texName;  
  11.   
  12. //产生纹理的函数  
  13. void makeCheckImage(void)  
  14. {  
  15.     int i, j, c;  
  16.     for ( i = 0; i < checkImageHeight; ++i )  
  17.         for( j = 0; j < checkImageWidth; ++j )  
  18.         {  
  19.             c = ((( i & 0x8) == 0 )^ (( j & 0x8)) == 0) * 255;  
  20.             checkImage[i][j][0] = ( GLubyte )c;  
  21.             checkImage[i][j][1] = ( GLubyte )c;  
  22.             checkImage[i][j][2] = ( GLubyte )c;  
  23.             checkImage[i][j][3] = ( GLubyte )255;  
  24.   
  25.         }  
  26. }  
  27.   
  28. void init( void )  
  29. {  
  30.     glClearColor(0.0,0.0,0.0,0.0);  
  31.     glShadeModel(GL_FLAT);  
  32.     glEnable(GL_DEPTH_TEST);  
  33.     makeCheckImage();  
  34.     glPixelStorei( GL_UNPACK_ALIGNMENT,1);  
  35.   
  36.     glGenTextures(1,&texName);  
  37.     glBindTexture(GL_TEXTURE_2D,texName);  
  38.   
  39. //  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP); //GL_CLAMP  GL_CLAMP_TO_BORDER     
  40. //  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);  //GL_REPEAT   GL_CLAMP_TO_EDGE  
  41.   
  42.     glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);  
  43.     glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);  
  44.     float color[4] = { 1.0f, 0.0f, 0.0f, 1.0f };  
  45.     glTexParameterfv( GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, color);  
  46.   
  47.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);  
  48.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);  
  49.   
  50.     glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,checkImageWidth,checkImageHeight,  
  51.         0,GL_RGBA,GL_UNSIGNED_BYTE,checkImage);  
  52.   
  53. }  
  54.   
  55. void display(void)  
  56. {  
  57.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
  58.     glEnable(GL_TEXTURE_2D);  
  59.     glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);  
  60.     glBindTexture(GL_TEXTURE_2D,texName);  
  61.       
  62.     glBegin( GL_QUADS );    
  63.       
  64.     glTexCoord2f( 0.0, 0.0);    
  65.     glVertex2f( -1.0, -1.0);     
  66.       
  67.     glTexCoord2f(  0.0, 1.8 );    
  68.     glVertex2f( -1.0, 1.0 );  
  69.       
  70.     glTexCoord2f(  1.8, 1.8 );    
  71.     glVertex2f( 1.0, 1.0 );  
  72.       
  73.     glTexCoord2f(  1.8, 0.0 );   
  74.     glVertex2f ( 1.0, -1.0 );  
  75.       
  76.     glEnd( );  
  77.     glFlush();  
  78. }  
  79.   
  80.   
  81. int main(int argc, char* argv[])  
  82. {  
  83.     glutInit(&argc, argv);  
  84.       
  85.     glutInitDisplayMode( GLUT_SINGLE|GLUT_RGBA);  
  86.       
  87.     glutInitWindowSize(512, 512);  
  88.     glutInitWindowPosition(0, 0);  
  89.       
  90.     glutCreateWindow("棋盘纹理");  
  91.       
  92.     glutDisplayFunc(display);  
  93.     glutIdleFunc(display);  
  94.       
  95.     init();  
  96.     glutMainLoop();  
  97.    
  98.     return 0;  
  99. }  


1. 首先是GL_REPEAT,这个比较简单,就是重复边界的纹理。产生的效果如下:



2. GL_CLAMP采用这种模式是,opengl就在一个2X2的加权纹理单元数组中使用取自边框的纹理单元。这时候的边框如果没有设置的话,应该就是原纹理的边界的像素值。



3. GL_CLAMP_TO_EDGE,在这种模式下,边框始终被忽略。位于纹理边缘或者靠近纹理边缘的纹理单元将用于纹理计算,但不使用纹理边框上的纹理单元。在实验中,不管有没有设置边框,都与与上面的GL_CLAMP结果相同。在下面的参考文献中给了一个解释:因为很多硬件并不支持边界处理,所以实现GL_CLAMP_TP_EDGE和GL_CLAMP的效果好象是一样的。




4.  GL_CLAMP_TO_BORDER如果纹理坐标位于范围[0,1]之外,那么只用边框纹理单元(如果没有边框,则使用常量边框颜色,我想常量边框颜色就是黑色)用于纹理。在靠近纹理坐标边缘的地方,无论是边框还是纹理内部都可能根据一个2X2的数组进行采样。




5.   在GL_CLAMP_TO_BORDER的基础上使用上面的代码设置GL_TEXTURE_BORDER_COLOR(设置边框颜色为红色),可以得到下面的结果:



转载自:http://blog.csdn.net/mutex86/article/details/9023863

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值