opengl 学习纹理

一.纹理是什么?

        纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节;类似于图像一样,纹理也可以被用来储存大量的数据,这些数据可以发送到着色器上。

        采样是指用纹理坐标来获取纹理颜色的过程。

        纹理坐标在x和y轴上,范围为0到1之间(注意我们使用的是2D纹理图像)。纹理坐标起始于(0, 0),也就是纹理图片的左上角,终始于(1, 1),即纹理图片的右下角。这里,与原作者的教案对不上,我通过自己的论证得到的坐标。原作者说的(0,0)坐标是在左下角,(1,1)坐标是右上角。大家有兴趣可以验证下,与我沟通,也可能是中文翻译出了问题。正确的是这样

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

        纹理坐标的范围通常是从(0, 0)到(1, 1),那如果我们把纹理坐标设置在范围之外会发生什么?OpenGL默认的行为是重复这个纹理图像(我们基本上忽略浮点纹理坐标的整数部分),但OpenGL提供了更多的选择,纹理环绕方式:

环绕方式 描述
GL_REPEAT 对纹理的默认行为。重复纹理图像。
GL_MIRRORED_REPEAT 和GL_REPEAT一样,但每次重复图片是镜像放置的。
GL_CLAMP_TO_EDGE 纹理坐标会被约束在0到1之间,超出的部分会重复纹理坐标的边缘,产生一种边缘被拉伸的效果。
GL_CLAMP_TO_BORDER 超出的坐标为用户指定的边缘颜色。

设置纹理环绕的方式用的函数是glTexParameter,第一个参数指定了纹理目标,我们使用的是2D纹理,因此纹理目标是GL_TEXTURE_2D;第二个参数需要我们指定设置的选项与应用的纹理轴。我们打算配置的是WRAP选项,并且指定ST轴(如何是3D纹理的话,还有一个参数是r);最后一个参数需要我们传递一个环绕方式。如下:

        设置x轴:glTexParamteri(GL_TEXTURE_2D,GL_TEXT_WRAP_S,GL_MIRRORED_REPEAT)

        设置y轴:glTexParamteri (GL_TEXTURE_2D,GL_TEXT_WRAP_T,GL_MIRRORED_REPEAT)

        设置边框:

        float borderColor[] = { 1.0f, 1.0f, 0.0f, 1.0f }; glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);

        纹理过滤是在物体很大而相对于纹理的分辨率又很低时,你需要使用它。opengl需要知道怎样将纹理的像素映射到纹理的坐标。纹理坐标是我们上面提供传入的顶点数组。纹理像素是把图像放大到像素级别时,单个像素的颜色。源作者给你的解释:

        你可以想象你打开一张.jpg格式图片,不断放大你会发现它是由无数像素点组成的,这个点就是纹理像素;注意不要和纹理坐标搞混,纹理坐标是你给模型顶点设置的那个数组,OpenGL以这个顶点的纹理坐标数据去查找纹理图像上的像素,然后进行采样提取纹理像素的颜色。

        好了,回归到纹理过滤上来,主要分为两种:邻近过滤(GL_NEAREST:默认的方式)和线性过滤(GL_LINEAR)。

        邻近过滤:OpenGL会选择中心点最接近纹理坐标的那个像素。如图,+号表示纹理坐标,所以蓝色的中心点离它最近,返回蓝色。

        线性过滤:OpenGL会基于纹理坐标附近的纹理像素,计算出一个插值,近似出这些纹理像素之间的颜色。一个纹理像素的中心距离纹理坐标越近,那么这个纹理像素的颜色对最终的样本颜色的贡献越大。说明白点的话,就是离+号越近的颜色点与最终样本的颜色越接近。

                                      

                                        邻近过滤                                                 线性过滤

        <

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风亲云叹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值