OGL(教程16)——基础贴图映射

原文地址:http://ogldev.atspace.co.uk/www/tutorial16/tutorial16.html

背景知识:
贴图的映射的意思是应用任何类型的图到3D模型的多个面上。这个图叫做纹理,它可以是任何东西。如砖头、树叶、贫瘠的土地,使用这些贴图增加场景的逼真程度。比如,看下面的两个图:
在这里插入图片描述

为了使纹理映射正确,你需要做三件事情。加载一个图片到OpenGL,提供顶点对应的纹理坐标,执行纹理采样操作,采样的使用的纹理坐标,以得到一个像素的颜色。由于三角形是被缩放、旋转、平移变换过的,最终才会被投影到屏幕上,而且在不同的摄像机视角来观察会有不同的效果。GPU所需要做的是,使贴图随着顶点的移动而一起移动。这样才能看起来逼真。为了实现这个,开发者需要提供一系列的坐标,被称之为纹理坐标,每个顶点都有对应的纹理坐标。由于GPU光栅化了三角形,它同样在三角形的表面上对纹理坐标也进行插值计算,然后在片段着色器中使用纹理坐标也采样贴图。这个动作称之为采样,采样的结果是一个单位纹理。这个单位纹理通常包含的是颜色,用来对一个像素点进行着色。在接下来的章节中,我们会看到单温纹理可以包含不同的数据,用来产生不同的效果。

OpenGL支持几种不同类型的贴图,如1D、2D、3D、立方体贴图等,用以实现不同的技术。我们现在从2D开始。一个2D的纹理有宽度和高度,可以是任意指定的大小。把宽度和高度相乘将会得到这个纹理总的单位纹理总数。你怎样指定一个顶点的纹理坐标?这个纹理坐标不是单位纹理在整个纹理贴图上的坐标。这样做的局限性很大,因为如果换一个不同大小的贴图之后,还需要更新所有顶点的纹理坐标,以作匹配这种新的贴图。理想的情况是,换贴图但是不要换纹理坐标。因此,纹理坐标被定义在纹理空间中,它的值都是在规格化的[0,1]范围内。这就意味着,纹理坐标通常是一个系数,然后把乘以纹理贴图的宽度或者高度以得到单位纹理在整个纹理中的坐标。比如,如果纹理坐标是[0.5,0.1],然后贴图的大小是宽度=320,高度=200,那么单位纹理的的位置在 (160,20) ,计算方式为:(0.5 * 320 = 160 以及0.1 * 200 = 20)。

最常用的变换是使用u和v作为纹理空间的轴,这里u代表了2D坐标系中的x轴,而v代表了2D坐标系中的y轴。OpenGL对u轴是从做到右,而v则是从下到上。如下图所示:
在这里插入图片描述

上图展示了纹理空间,左下角是原点。u是向右增长,而v向上增长。我们现在来考虑三角形,它的纹理坐标如下所示:

在这里插入图片描述

加入我们使用这个纹理,那么将会得到上面的图,而如果经过多种变换之后,我们会得到如下的图:
在这里插入图片描述

正如你看到的,纹理坐标和顶点黏在一起的,这个顶点的一个属性,在变换的时候不会改变。在插值的时候,多个像素会得到相同的纹理坐标。我们对物体进行旋转、拉伸、挤压,纹理也会随之变换,但是也有技术让纹理运动起来,通过改变纹理坐标实现,但是目前我们保持纹理坐标不变。

另外一个很重要的概念是,就是过滤。我们已经讨论过怎样使用纹理坐标采样一个纹理单元。单位纹理的位置通常是整数,而当纹理坐标是浮点数,比如0到1之间的某个浮点数,被映射成了 (152.34,745.14),这种情况下,向下取整变为(152,745)。所以,这个工作会得到差不多的效果,但是在某些情况下会变得很糟糕。另外一个很好的解决方式是,把此点的纹理用2x2个整数单位的单位纹理进行差值,比如上面的用(152,745),(153,745), (152,744) 和 (153,744)来做差值得到最终的颜色,这个线性差值,使用的是 (152.34,745.14)到四个点的距离进行差值。距离越近的,对颜色贡献越大,这种效果比之前的那个方法要好。

哪个纹理单位最终被选择,通常叫做过滤。最简单的方式是最近距离过滤,更复杂的方式是我们上面使用的线性过滤。近邻顾虑的领啊为一个名字是点过滤。OpenGL提供了几种不同类型的过滤方式,你可以选择其中任一个。通常,提供更好效果的过滤方法,其耗时也会大。所以在性能和效果之间要做一个权衡。

现在,我们理解了OpenGL是如何使用纹理坐标来采样一个纹理。纹理在OpenGL中,蕴含着四个概念:纹理对象,纹理单元,采样对象和shader中的采样统一。这个不懂。

纹理对象包含了纹理的图片的数据,单位是纹理单元。纹理可以是不同的类型,1D,2D不同维度。数据类型可以是不同的格式,如RGB、RGBA等。OpenGL指定原数据在内存中的起始位置,然后加载数据到GPU。还有很多其他的参数你可以控制,比如过滤的类型等。纹理对象也会关联一个顶点缓冲对象。当创建了这个句柄之后,加载纹理数据和参数之后,你可以再不同的句柄之间做绑定,以得到不同的OpenGL状态。你不再需要加载数据。从现在开始,OpenGL驱动的任务是确保在GPU渲染之前把数据加载好。

纹理对象不是直接绑定到shader,shader是真正做采样的地方。但是,纹理单元所对应的索引需要传递给shader。这样shader可以通过纹理单元来访问对纹理对象。有可能有多个纹理单元,最多有几个和显卡有关系。为了绑定一个纹理对象A到纹理单元0,你首先要确保单元0是可用的,然后才能绑定纹理对象A。你可以把纹理单元1变为可用,然后绑定另外一个或者相同的纹理对象给它。

每个纹理单元有几种不同的纹理对象,这会造成一定的复杂度。这个叫做纹理对象的目标。当你绑定纹理对象到纹理单元之后,你要指定纹理对象是1D,2D还是其他类型。所以你可以把纹理对象A绑定到1D对象,纹理对象B绑定到2D目标。

采样操作通常发生在片段着色器中,而且有一个单独的函数来处理。采样函数需要知道纹理单元来访问,你可以在片段着色器中采样多个纹理单元。这里有一组特殊的统一变量来做这个事情,根据纹理目标,有sampler2D、samper2D、sampler3D、samplerCube等等。你要创建你想要的采样器统一变量。

最后一个概念是采样对象,不要把采样统一变量和他弄混了。他们是单独的实体。一个事情是,贴图对象包含了贴图数据,而且还有一个采样的参数配置。这些参数是采样的状态。但是,你可以创建采样对象,配置它一个采样状态,然后绑定到纹理单元。当你对采样对象做这些事情,将会改变他的状态。不要担心——现在我们不需要使用采样对象,我们现在只需要知道它的存在即可。

下图总结了纹理相关的概念:
在这里插入图片描述

代码注释:
OpenGL知道从内存中使用不同的格式加载纹理数据,但是不提供任何方法加载PNG和JPG格式图片到内存。我们需要使用额外的库。在ImageMagick中有很多选项,它是一个免费的库,支持很多图片格式,而且是跨平台的。查看链接http://ogldev.atspace.co.uk/instructions.html 来安装。

大多数的纹理处理函数都封装在下面的类中:

(ogldev_texture.h:27)class Texture
{
public:Texture(GLenum TextureTarget, const std::string& FileName);bool Load();void Bind(GLenum TextureUnit);
};

当创建一个Texture对象时,你需要指定目标,我们使用GL_TEXTURE_2D还有文件名。之后我们可以使用Load函数。这个可能会失败,如果文件不存在,或者ImageMagic遇到了其他的错误。当你使用指定的纹理实例时,你需要绑定它到纹理单元。

(ogldev_texture.cpp:31)try {m_pImage = new Magick::Image(m_fileName);m_pImage->write(&m_blob, "RGBA");
}
catch (Magick::Error& Error) {std::cout << "Error loading texture '" << m_fileName << "': " << Error.what() << std::endl;return false;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/354253.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【UE4】官方课程笔记

【UE4】官方课程笔记 Blueprint Project Config project-specific settings Content content folder Intermidiate 可删除&#xff0c;暂时性文件 Saved 一旦删除不可恢复的文件 DDC DRIVE DATA CACHE C Project .sln文件 可删除&#xff0c;再次打开时recreated Sourc…

shader graph_在Shader Graph中使用表面梯度框架进行法线贴图合成

shader graph A recent Unity Labs paper introduces a new framework for blending normal maps that is easy and intuitive for both technical artists and graphics engineers. This approach overcomes several limitations of traditional methods.

OpenGL学习笔记(四)-光照-材质-光照贴图

参考网址&#xff1a;LearnOpenGL 中文版 哔哩哔哩教程 第二章 光照 2.1 颜色 现实生活中人眼看到某一物体的颜色&#xff0c;是它所反射的颜色。如将白光照在红色的玩具上&#xff0c;玩具会吸收白光中除了红色以外的所有子颜色&#xff0c;不被吸收的红色光被反射到我们的…

三维建模贴图技巧

作者&#xff1a;关宇 #一、概述 整个三维项目中建模制作为核心环节&#xff0c;决定了整个项目的框架基础。在制作的时候参考数据尤为重要决定了模型的精度。 一个完整的三维模型包括白模和贴图&#xff0c;白模决定了模型的外形结构&#xff0c;而贴图赋予色彩和细节。 个人…

提升树叶渲染性能

树的渲染的大部分消耗都是花在树叶上&#xff0c;为了是树叶看起来很茂密&#xff0c;美术一般会加很多叶子的三角形&#xff0c;但是三角形太多的话会让vs压力很大&#xff0c;因为树叶的动画都是在vs里完成的&#xff0c;因此大多游戏都采用的是Leaf Card也就是Billboard Lea…

【Unity Shader】树叶晃动效果原理及实现

1 树叶晃动原理 在模型空间下&#xff0c;对顶点进行X轴和Y轴上的偏移。 1.1 方法 通过计算顶点与Y轴单位向量的点积求得stage1。通过计算顶点与X轴单位向量的点积&#xff0c;加上时间分量_Time.y&#xff0c;求其正弦值stage2。将stage1/stage2与向量(0.001, 0, 0.001)相乘…

blender 2.8制作面片树叶的shading node设置

1. 创建Pricipled BSDF材质&#xff0c;并设置材质Settings的Blend Mode为Alpha Blend模式! 2. 在shading窗口内设置节点&#xff1a; 添加下列节点 Texture Coordinate Mapping Image Texture Image Texture Transparent BSDF Principled BSDF Mix Shader Material Output…

【UE4 Material 101学习笔记】 :Lec08/10/11/12 视差贴图的应用/布料着色/体积冰效果/树叶摇动

Lec08 视差贴图 原理 LearnOpenGL视差贴图 1. 使用高度图偏移UV 未使用高度贴图偏移UV时 使用之后&#xff0c;表面不平坦产生的阴影会更为明显一些。 当角度较大时&#xff0c;失真比较明显。 2. 视差遮蔽映射&#xff08;Parallax Occlusion Mapping&#xff09; 可弥…

UE风格化Day19-树叶材质

材质蓝图的基础技巧 补充一些材质蓝图的基础技巧&#xff0c;虽然比较基础&#xff0c;但是刚开始学的时候完全没有教程专门提到这个&#xff1a; 材质的管理一般分为&#xff1a;材质函数、材质、材质实例 首先网格体一般挂的材质就是用材质实例&#xff0c;当然也可以直接挂…

Quixel megascans模型材质贴图合集包

Quixel megascans是一个在线高分辨率扫描模型和贴图库&#xff0c;一致的PBR校准的表面&#xff0c;植被&#xff0c;和三维扫描模型&#xff0c;还包括用于管理的桌面应用、混合和输出你的扫描数据的程序。它的产品已经与游戏和电影工作室合作。 quixel megascans可以帮助您创…

自动化测试Junit

目录 Junit5注解TestDisabledBeforeAll、AfterAll、BeforeEach、AfterEach 参数化单参数多参数CSV获取参数方法获取参数 测试用例执行顺序断言 assert断言相等断言不相等断言为空断言不为空 测试套件 自动化测试项目1. 熟悉项目2. 针对核心流程设计手工测试用例3. 将手工测试用…

解释PBR纹理贴图(texture-maps)

纹理贴图&#xff0c;不管你是学习sp绘制纹理&#xff0c;还是利用渲染器创造艺术作品&#xff0c;接触到PBR流程&#xff0c;总要面对各种贴图。我在学习的时候&#xff0c;有时候搞得懂&#xff0c;有时候糊里糊涂&#xff0c;我想还是要做个笔记的&#xff0c;好记性不如烂笔…

PBR贴图基础知识

PBR贴图基础知识 一&#xff0c;基础知识二&#xff0c;PBR贴图类型传统次世代方式PBR次世代方式1&#xff0c;金属度粗糙度流程---Base ColorMetallicRoughness2&#xff0c;反射度光滑度流程---Diffuse/AlbedospecularGlossiness/Smoothness3&#xff0c;通用贴图类型法线贴图…

UE4 Material 101学习笔记——08-12 凹凸和视差贴图/纹理压缩/布料/体积冰/摇曳树叶

UE4 Material 101学习笔记——08-12 凹凸和视差贴图/纹理压缩/布料/体积冰/摇曳树叶 Lec08 凹凸和视差贴图 Bump Offset and Parallax Occlusion MappingLec09 纹理压缩与设置 Texture Compression and SettingsLec10 布料着色器 Cloth Shading10.1 了解布料10.2 布料shader Le…

技术美术个人笔记(十四)——Houdini程序化树木

前言&#xff1a;关于大地形美术资产制作部分的houdini程序化树木部分&#xff0c;原houdini内置有Labs Quick Basic Trees节点&#xff0c;以下步骤均基于此节点优化魔改&#xff1b; 效果预览&#xff1a; tip&#xff1a;其中树叶贴图及地形颜色变化通过在材质中对贴图采样…

CSS3+js绘制3D圣诞树

最近大家都在用代码写圣诞树&#xff0c;我也跟个风吧&#xff01; 主要技术&#xff1a; 1.CSS3的3D变换 2.DOM动态添加节点 开发环境&#xff1a;vscode 目录 一.引入 二、基本知识 1.CSS3的3D变换 (1).空间直角坐标系 (2).transform详解 (3).transform-style 2.DOM节点…

unity透明通道加颜色_树叶透明贴图的制作原理及渲染!

对于很多刚开始接触渲染模块的同学来说&#xff0c;不知道透明贴图的制作原理&#xff0c;以及如何渲染出好的效果&#xff0c;今天结合案例给大家讲解一下&#xff0c;先打开我们需要的素材&#xff0c;如下图&#xff1a; 在制作之前我们先给树叶一个普通的blinn材质&#xf…

SpringBootWeb案例-2(上)

前面我们已经实现了员工信息的条件分页查询以及删除操作。 关于员工管理的功能&#xff0c;还有两个需要实现&#xff1a; 新增员工修改员工 首先我们先完成"新增员工"的功能开发&#xff0c;再完成"修改员工"的功能开发。而在"新增员工"中&…

微调样本质量胜于数量 LIMA: Less Is More for Alignment

1、总体介绍 大型语言模型的训练分为两个阶段&#xff1a;&#xff08;1&#xff09;从原始文本中进行无监督的预训练&#xff0c;以学习通用的表征&#xff1b;&#xff08;2&#xff09;大规模的指令学习和强化学习&#xff0c;以更好地适应最终任务和用户的偏好。 作者通过…

XP系统如何把文本转换成html,xp系统下将HTML文件设置为屏保的方法

关于XP系统的屏保设置&#xff0c;很多人脑子中肯定有个固定的样式&#xff0c;因为按照XP系统的传统来说&#xff0c;都是固定的按照图片来设置的&#xff0c;所以很多人就对屏保有了一定的硬性思维&#xff0c;就是只能是图片的形式。其实这样的想法是有所偏差的&#xff0c;…