首页 > 代码库 > openGL 纹理05

openGL 纹理05

纹理(Texture)

为了能够把纹理映射(Map)到三角形上,我们需要指定三角形的每个顶点各自对应纹理的哪个部分。

这样每个顶点就会关联着一个纹理坐标(Texture Coordinate) 用来标明从纹理图像的哪个部分采样(采集片段颜色)。

之后在图形的其它片段上进行片段插值(Fragment Interpolation)。

 

纹理坐标在x和y轴上,范围为0到1之间。(注意我们使用的2D纹理图像)。

使用纹理坐标获取纹理颜色叫做采样(Sampling)。

纹理坐标起始于(0,0),也就是纹理图片的左下角,终始于(1,1)即纹理图片的右上角。

下面的图片展示了我们是如何把纹理坐标映射到三角形上的。

技术分享

 

我们为三角形指定了3个纹理坐标点。

三角形左下角顶点纹理坐标设置为(0,0);

上顶点纹理坐标设置为(0.5,1.0);

右下方顶点设置为(1,0);

我们只要给顶点着色器传递三个纹理坐标就行了,接下来它们会被传到片段着色器中,它会把每个片段进行纹理坐标的插值。

纹理坐标看起来就像这样:

GLfloat texCoords[] = {      0.0f, 0.0f,   //左下角       1.0f, 0.0f,  //右下角      0.5f, 1.0f   //上中};

对纹理采样的解释非常宽松,它可以采用几种不同的插值方式。

所以我们需要自己告诉OpenGL该怎样对纹理采样。

 

纹理环绕方式

纹理坐标的范围通常是从(0,0)到(1,1) 那如果我们把纹理坐标设置在范围之外会发生什么?

OpenGL默认行为是重复这个纹理图像(我们基本上忽略浮点纹理坐标的整数部分)

但OpenGL提供了更多的选择:

环绕方式                      描述

GL_REPEAT                          对纹理的默认行为,重复纹理图像。

GL_MIRRORED_REPEAT        和GL_REPEAT 一样,但每次重复图片是镜像放置的。

GL_CLAMP_TO_EDGE            纹理坐标会被约束在0到1之间,超出部分会重复纹理坐标的边缘,产生一种边缘被拉伸的效果。

GL_CLAMP_TO_BORDER       超出的坐标为用户指定的边缘颜色。

 

前面提到的每个选项都可以使用glTexParameter*函数对单独的一个坐标轴设置(s、t(如果是3D纹理那还有一个r)它们和x、y、z是等价的):

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_MIRRORED_REPEAT);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_MIRRORED_REPEAT);

第1个参数指定了纹理目标;2D纹理 是GL_TEXTURE_2D;

第2个参数指定设置的选项与应用的纹理轴,配置的是WRAP选项,并且指定s和T轴。

第3个参数是指定的环绕方式。

openGL 纹理05