OpenGL 从入门到成魔-第7章-纹理和纹理坐标

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenGL 从入门到成魔-第7章-纹理和纹理坐标相关的知识,希望对你有一定的参考价值。

参考技术A 注:参考自bilibili系列视频,OpenGL 从入门到成魔-第7章-纹理和纹理坐标,更详细的内容可以从视频获取 https://www.bilibili.com/video/BV1bZ4y1W7tX

我们可以为每个顶点添加颜色来增加图形的细节,从而创建出有趣的图像。但是,如果想让图形看起来更真实,我们就必须有足够多的顶点,从而指定足够多的颜色。这将会产生很多额外开销,因为每个模型都会需求更多的顶点,每个顶点又需求一个颜色属性。程序员们更喜欢用纹理,纹理是一个2D图片,他可以用来添加物体的细节。我们可以在一张图片上插入非常多的细节,这样就可以让物体非常精细而不用指定额外的顶点。

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

GLSL有一个供纹理对象使用的内建数据类型,叫做采样器(Sampler)。我们可以声明一个uniform sampler2D texture把一个纹理添加到片段着色器中,通过在CPU调用 glUniform1f()函数,向texture传值,从而实现载入纹理(图片)到Shader。

当调用glTexImage2D时,当前绑定的纹理对象就会被附加上纹理图像。该函数最终会把图像数据从CPU端,搬到GPU端,即第一步创建的texture中。

由此,看出图片的本真。
传到上面函数的最后一个参数中。

首先,0号纹理单元和纹理绑定,然后0号纹理单元和shader里的sampler2D texture变量绑定,从而做好对应。
一个shader中,最多处理32个纹理单元,openGL es,最多处理16个。

GLSL内建的texture函数来采样纹理的颜色,它第一个参数是纹理采样器,第二个参数是对应的纹理坐标。texture函数的返回值就是,在该纹理坐标上的rgba值(vec4)。

此时,我们的纹理已经绘制出来了,但是上下颠倒了。这是因为OpenGL纹理坐标系中左下角为原点(0,0),而图片的原点在左上角,所以在y轴上颠倒了。stb_image.h(图像加载库,需引入)能够在图像加载时帮助我们翻转y轴,只需要在加载任何图像前加入以下语句即可:

若没有用图像加载库,就把纹理坐标上下颠倒一下。

以上是关于OpenGL 从入门到成魔-第7章-纹理和纹理坐标的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 从入门到成魔-第4章-VAO 和 VBO

Unity Shader入门精要学习笔记 - 第7章 基础纹理

OpenGL ES iOS 入门实例

Unity Shader入门精要学习笔记 - 第10章 高级纹理

Unity Shader入门精要学习笔记 - 第13章 使用深度和法线纹理

✠OpenGL-8-阴影