您当前的位置: 首页 >  ar

龚建波

暂无认证

  • 3浏览

    0关注

    312博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

LearnOpenGL学习笔记:纹理

龚建波 发布时间:2019-11-19 15:26:07 ,浏览量:3

( 本文对应学习章节:https://learnopengl-cn.github.io/01%20Getting%20started/06%20Textures/ )

0.前言

之前我们是用顶点和颜色来完成几何图形的绘制,但是遇到复杂的图形就会变得很复杂,这时候纹理(Texture)就登场了。纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节。因为我们可以在一张图片上插入非常多的细节,这样就可以让物体非常精细而不用指定额外的顶点。

1.认识纹理

为了把纹理映射(Map)到一个区域我,我们需要指定区域的每个顶点各自对应纹理的哪个部分。这样每个顶点就会关联一个纹理坐标(Texture Coordinate),用来标明该从纹理图像的哪个部分采样(采集片段颜色)。之后在图形的其它片段上进行片段插值(Fragment Interpolation)。

纹理坐标在x和y轴上,范围为0到1之间(注意我们使用的是2D纹理图像)。使用纹理坐标获取纹理颜色叫做采样(Sampling)。纹理坐标起始于(0, 0),也就是纹理图片的左下角,终始于(1, 1),即纹理图片的右上角。下面的图片展示了我们是如何把纹理坐标映射到三角形上的(来自LearnOpenGL)。

纹理坐标现在就是这样:

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

对纹理采样的解释非常宽松,它可以采用几种不同的插值方式。所以我们需要自己告诉OpenGL该怎样对纹理采样。 教程里主要讲了纹理环绕方式、纹理过滤、多级渐远纹理三种,直接通过代码来学习更容易理解点。

2.纹理的使用

这部分代码相对于前面的更麻烦点,除了使用着色器章节自定义的着色器类,教程还引入了一个图像加载库 stb_image.h ,由于官网下载太慢了,我直接clone的LearnOpenGL的github项目代码:https://github.com/JoeyDeVries/LearnOpenGL 。里面有教程用到的库,以及教程的源码,方便对比学习。

和VBO、EBO一样,纹理也是使用ID引用的。生成一个纹理的过程是这样的:

unsigned int texture;
// 创建纹理对象
glGenTextures(1, &texture);
// 将命名纹理绑定到纹理目标,参数1为绑定的目标,参数2为纹理对象
glBindTexture(GL_TEXTURE_2D, texture);
// 为当前绑定的纹理对象设置环绕、过滤方式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);   
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// 加载并生成纹理
int width, height, nrChannels;
unsigned char *data = stbi_load("container.jpg", &width, &height, &nrChannels, 0);
if (data)
{
    // 当前绑定的纹理对象会被附加上纹理图像
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
    // 为当前绑定的纹理自动生成所有需要的多级渐远纹理
    glGenerateMipmap(GL_TEXTURE_2D);
}
else
{
    std::cout             
关注
打赏
1655829268
查看更多评论
0.3105s