Vico Bill< 刘 利 波 > 的个人网站

记录关于学习、工作中的技术点滴

C,C++,Rust,Ruby爱好者;热衷于游戏开发、任务自动化与跨平台;沉迷于游戏引擎与图形表现;深信'简单、多元'哲学的力量。


访问主页

【DailyGfx】3-Mesh

在图形渲染管线最前面,是模型数据,也称为网格(Mesh)。网格是多边形列表,在图形学中,网格多采用三角形列表,也就是说,网格实质上是由若干三角形组合而成。

如何让若干三角形正确表示一个模型呢?那么必不可少的必定是顶点。三角形由3个顶点构成。如果只是简单地列出这些顶点或这些三角形,不足以正确描述此模型。那么还缺的是如何互相组合顶点。网格的三角形,必定会有很多是共用顶点、共用边的,只存储三角形列表,会浪费许多空间。所以在图形学中,往往使用两个数组:顶点表和索引表,相互协作来达到描述网格三角形组的目的。

既然有索引表,那么肯定存在顺序问题。如果要表示同一个模型,顶点表中顶点存放的顺序发生了改变,那么索引表中的数据肯定会发生改变,所幸这种琐碎的事情常常由3D建模工具完成。当然,如果是2D模型又如何?2D模型往往三角形面少,易于管理,即使是手动管理也是可行的,但3D模型非常复杂, 手动管理模型数据简直是吃力不讨好。

网格模型的三角形索引顺序主要有:上下,逆顺时针。通常的顺序(以底部视图)是从下向上,顺时针索引。

理解了3D模型网格的组成原理,那么可以设计自动生成模型的工具。

三角形列表,实质上还存在隐藏的图元(Primitive)属性。就如同房子一样,只有钢筋骨架和有钢筋骨架带玻璃,那是不一样的。如果顶点表和索引表采用点图元,那么模型则仅是散列点云而已;如果采用线图元,那么顶点会两两结合成线,那么模型则是散列线云;如果采用线带,则是线框等。也会有其他图元如Quad,Polygon,Fan等,不同的图元属性,会构成不同的模型表面。

纹理贴图

除了模型表面之外,我们还需要给模型外观。最常见的是不同的三角形有不同的颜色,所以在顶点中,可以附加颜色信息,来决定组成的三角形的颜色。这是最常见的,但通常有从图片(纹理)直接获取颜色细节的操作。这就像是给表面涂上颜色,顶点附加颜色信息,那是涂纯色;顶点附加纹理坐标,这是贴图。这2种操作都称为贴图,纯色是特殊的纹理。

这里纹理、图片是同种概念,都指代颜色/像素矩阵,但图片通常具压缩信息,纹理是感官上的概念

对于贴图,就像有一张图,要将其贴到表面上。在开始讲述贴图的详细过程时,我们先引入一个专有术语:纹素(Texel),从纹理获取的像素。需要和像素做一下区分,像素是三角形面光栅化后生成的填充单元。以下所说的纹素和像素是有区别的。

贴图时,会遇到这样几种情况:

  • 图太小,表面太大:
    • 如果是单图满贴,那么图势必会拉伸,也意味着一个纹素颜色应用至多个像素;
    • 如果多图满贴,则有几种方式:
      • 将多份小图平铺,填满表面。平铺也有讲究:
        • 线性平铺:复制原图依次平铺,无缝拼贴
        • 镜像平铺:纹理会镜像后平铺
      • 按小图的边应用颜色:超出部分,全黑/白;或者,根据边的颜色,应用至超出部分
  • 图太大,表面太小:
    • 图会缩小以适应,那么多个纹素的颜色,会应用至一个像素。通常在内部会应用混合算法,将多个纹素颜色混合。这会造成颜色模糊。

光照贴图

最近的文章

【Game】-美术资源管理办法

Unity 项目的目录结构推荐:以下为 Unity 默认资源目录,存放在项目 Assets 目录下,即根目录: Plugins:Unity 默认的插件目录 x86 x86_64 Android iOS Editor Default Resources:编辑器用到的资源 StreamingAssets : Unity 默认的流式资源目录。 Gizmos:Unity 默认 icon 目录。 ImportedAss...…

继续阅读
更早的文章

【DailyGfx】2-Shader

在现代渲染管线中,硬件GPU常常由显卡驱动程序驱动。显卡驱动常常适配至操作系统,以使操作系统能操纵显卡显示出图形。操作系统主要职能就是控制计算机所有的硬件资源,并提供接口给程序员使用。显卡也是硬件资源之一,当然也不例外。所以,我们常说的图形API OpenGL,Vulkan,DirectX等,都是由标准制定机构进行制定,与显卡驱动提供商进行约定,制定出标准。接着操作系统、显卡驱动商协商一致之后,提供给程序员用的接口,即是图形API。程序员通过图形API,可以让显卡供我们工作。那Shader...…

继续阅读