第一章:模型从硬盘文件到显示器像素的全过程分析

模型从硬盘文件到显示器像素的全流程分析

  • 引言
  • 一、硬盘中的模型文件
    • (1)分离式模型文件
    • (2)模型主文件
      • 2.1 顶点几何与索引数据构成模型表面
      • 2.2 通过材质或贴图为模型表面着色
      • 2.3 通过骨骼动画驱动模型
  • 二、CPU中的模型数据
  • 三、GPU中的模型数据
  • 三、Shading

引言

  • 艺术家使用Blender、MAYA、3DS MAX等建模软件将设计好的模型导出为硬盘文件,而最终我们看到的模型是显示器上的像素,从硬盘文件到显示器像素,这其中究竟发生了什么?
    在这里插入图片描述

  • 本文主要对 “模型从硬盘文件到显示器像素” 的全过程进行理论分析,硬盘文件即艺术家导出的模型文件,显示器像素即显示器屏幕上显示模型的像素。

一、硬盘中的模型文件

  • 当艺术家导出模型时需要选择文件格式,常见的模型文件格式有:FBX、GLTF、OBJ等,不同格式存储模型数据的方法大相径庭,同一格式也可能由于版本和形式不同导致存储的数据不同。例如GLTF具有1.0和2.0两个不同版本,FBX具有分离式和嵌入式两种不同形式。分离式和嵌入式是许多模型格式都具有的不同形式,分离式可以将模型的贴图分离到一个文件夹中存储,而嵌入式则会将贴图直接嵌入到模型文件中。下图展示了广泛使用的GLTF格式。
    在这里插入图片描述

  • 使用怎样的模型格式是一个值得考虑的问题,本文考虑到FBX和GLTF格式使用的广泛性,使用FBX和GLTF格式作为研究对象,为了能够直接查看和处理模型贴图,采用分离式FBX和GLTF。

(1)分离式模型文件

  • 对于分离式模型文件,其存储的内容如下图所示。模型文件分为主文件和纹理文件夹,这是因为采用了分离式,所以纹理文件并不包含在模型主文件中。
    在这里插入图片描述
  • 纹理文件中存储了模型的一系列贴图,可能是JEPG、PNG和DSS等格式,纹理文件其实就是一个文件夹,打开后可以直接查看和修改其中的纹理图片。而模型主文件往往是代表整个模型的文件,比如分离式GLTF2.0的模型主文件是xxx.gltf,而FBX的模型主文件是xxx.fbx。
  • 经典的GLTF2.0分离式模型文件如下图所示,其中textures文件夹保存了模型的纹理文件,而scene.gltf为模型主文件。当你使用建模软件或游戏引擎读取模型文件时,选择模型主文件即可代表整个模型文件。
    在这里插入图片描述

(2)模型主文件

  • 模型主文件存储的内容如下图所示。接下来将介绍顶点的几何数据、顶点几何数据与索引数据如何构成模型表面、如何通过材质或贴图为模型表面着色、如何使用骨骼动画驱动模型。
    在这里插入图片描述

2.1 顶点几何与索引数据构成模型表面

  • 顶点数据存储了一系列顶点,每个顶点具有自己的几何数据即:位置、法向量、纹理坐标、切线向量。
  • 有了顶点要如何组成世界中的实体呢?答案是必须要将顶点连接起来,构成模型表面,这样才能作为世界中的实体被人们看到。游戏中常常使用三角形来构成模型表面,那么如何才能知道哪三个顶点构成一个三角形呢?我们可以将顶点按照构成三角形的集合依次排开,这样顶点数组中每三个顶点即对应一个三角形。
  • 虽然上述方法能够解决问题,但它并不好,因为一个顶点可能会构成多个三角形,因此这种方法会造成一个顶点数据在数组中保存多次。考虑使用一个索引数组,每个索引可以获取到顶点数组中的对应顶点,每三个索引即可对应到一个三角形,这样使用相同的顶点时我们仅需指定相同的索引即可,而不用保存重复的顶点数据。当然构成模型表面的也可以是四边形,这称为模型的图元拓扑类型。
  • 下图展示了如何由顶点构成模型表面。可以看到石头凸起的地方为顶点,多个顶点连接构成一个多边形面,多个面构成了物体表面。采用类似下图的多边形面数建模人物只能建出方块人,易知多边形的面数越多则其细节越丰富,但多边形数的增大会导致GPU计算量的越大,因此许多模型网站提供“低多边形”的模型分类,以此满足较低性能设备的开发需求。
    在这里插入图片描述

2.2 通过材质或贴图为模型表面着色

  • 由2.1中我们即可构建出模型的表面,我们平常在游戏中看到的模型就是通过许多个三角形构成的表面,那么如何才能为模型的表面上色呢?
  • 方案一:采用纹理贴图。每个顶点具有一个纹理坐标,如果模型具有纹理贴图,查找顶点对应的纹理贴图在纹理坐标处的颜色值,将此颜色值作为此顶点的颜色,这样每一个顶点都具有了颜色。当显卡渲染物体表面时,每个顶点处的像素可直接使用顶点颜色,而顶点之间的像素使用数学插值的方法计算出一个颜色值,这样物体表面每一个像素都具有颜色了,即完成了模型表面的着色。当然,对于纹理坐标和纹理贴图等数据,由艺术家负责生成,我们只需使用即可。
  • 方案二:采用材质数据。考虑不采用贴图,如果我们为每个顶点附带一个颜色值材质数据,以此指定顶点的颜色,那么也可以完成模型表面的着色。
  • 虽然上述方案可以完成物体表面的着色,但是它的效果是非常差劲的,请回忆3A游戏的画面,其中模型表面的颜色并不是一成不变的,它会随着灯光和摄像机的视角发生改变,产生高光、阴影等许多效果。因此使用单一的颜色值直接着色是不可取的,除非如果你只是想画个白色方块。高级的着色效果如下图所示。
    在这里插入图片描述
  • Phong模型是一种来源于经验和直觉的着色模型,使用它计算顶点的最终颜色,即可让物体表面产生高光的效果。它的升级版着色模型是Blinn-Phong。目前实时渲染领域最为流行和逼真的着色模型为PBR模型,它是基于物理的渲染模型。后面我们会介绍PBR着色模型,现在你只需要知道PBR模型以基础颜色、金属度、粗糙度、自发光、环境光遮蔽等属性作为输入即可,通过这些属性,PBR着色模型就能计算出顶点的最终颜色。
  • 互联网上许多模型都是使用PBR着色的,即模型的创作者在设计模型时就生成了顶点的基础颜色、金属度、粗糙度等信息,我们直接使用即可。类似于上述的两种着色方案,PBR需要的输入信息也可以保存在纹理贴图或材质中。艺术家可能在纹理文件中放置了基础颜色、金属度、粗糙度等贴图,这样在为顶点着色时根据其纹理坐标和各个贴图,即可获取顶点的基础颜色、金属度、粗糙度等属性,以此作为输入,即可计算出PBR模型下顶点的颜色。
  • 艺术家也可以不生成模型贴图,而为每个顶点指定所用材质,不同材质有不同的基础颜色、金属度、粗糙度等属性,这时我们就需要直接根据顶点材质数据获取所需属性。

2.3 通过骨骼动画驱动模型

  • 使用PBR着色模型我们能够渲染出类似上图球体的酷炫效果,但是如果整个3D场景一动不动,那么还有什么意思呢?简单的模型移动不能满足用户的需求,我们在游戏中常常会试图使用角色进行攻击、跳跃和躲避,只有实现这些功能才能使模型变得生动,那么该如何实现呢?
  • 使用骨骼动画即可实现驱动模型的效果。考虑人体骨架,挥动我们的胳膊小臂,我们发现手会跟着运动,抬起我们的二头肌即胳膊大臂,我们发现小臂和手都跟着运动了。易知人体骨架其实是一种层次关联关系,当父对象运动时子对象也需要运动,以此保持父子的相对位置关系不变。
  • 我们通常将人体骨架的盆骨作为根骨骼,一个标准的人体骨架如下图所示。
    在这里插入图片描述
  • 假设有一个骨骼数组int bone[BoneNum],其中bone[i]表示第i块骨骼的父骨骼索引,据此我们就可以构建骨架的树状层次结构。每个骨骼都有一个至父矩阵,当骨骼乘以其至父矩阵后便能变换到其父骨骼空间中,因此根据bone和至父矩阵,我们要将一块骨骼如手变换至顶级坐标系时,就要先将其乘以至父矩阵变换到小臂坐标系中,再乘以小臂坐标系变换到大臂坐标系中,这样子对象就受到了父对象的影响,当大臂运动时,此计算机制将导致小臂、手随之运动。
  • 当然骨架的根骨骼即盆骨是没有父对象的,因此其至父矩阵为单位矩阵,其他骨骼都需要一路至父变换到根骨骼。弄清楚了骨架之间如何实现父骨骼影响子骨骼,我们考虑如何变换顶点。模型中的骨骼是看不见的,显示器显示的是物体表面即顶点,那么如何让顶点随着骨骼运动呢?考虑胳膊肘处的顶点,它会随着小臂和大臂的移动而被拉伸即移动,因此顶点可能受到多块骨骼的影响(一般最多为四块),模型文件中记录了影响顶点的骨骼索引和权重数组,比如骨骼索引数组可能为:3 5 7 9,而权重数组可能为:0.1 0.3 0.4 0.2。每块骨骼具有一个偏移矩阵,受其影响的顶点乘以偏移矩阵即可变换到骨骼空间。每个顶点将位置以此乘以每个关联骨骼的最终变换矩阵及权重,再对其求和,即可计算出顶点的位置,以此实现骨骼动画。

二、CPU中的模型数据

三、GPU中的模型数据

三、Shading

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

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

相关文章

【第七章】深度学习思维模式

前言 尽管我们的神经网络表现出令人印象深刻的性能,但这种性能在某种程度上是神秘的。网络中的权重和偏差是自动发现的。这意味着我们并没有立即能够解释网络如何实现其功能。我们能否找到某种方式来理解我们的网络是如何对手写数字进行分类的原则?而且…

高中数学:复杂函数图像的草图画法(较难)

一、三大基本函数图像 1、指数函数图像 2、对数函数图像 3、幂函数图像 二、案例 口诀:上加下减,左加右减 1、指数函数图像变化规律 2、带绝对值的函数图像 情况1:绝对值套住整个函数表达式 画法原则:x轴下方的图像&#xff0…

【计算机组成原理】处理机管理

目录 一、处理机分类 1. MPU 2. MCU 3. DSP 二、CPU的功能 1. 指令控制 2. 操作控制 3. 时间控制 4. 数据加工 三、CPU的组成 (一)控制器 1. 控制器的功能 (1)控制指令执行的顺序 ① 程序中规定的转移类型指令 ② …

Nacos与Eureka的使用与区别

Nacos与Eureka的使用与区别 单体架构:优点缺点 分布式架构需要考虑的问题:微服务企业需求 认识SpringCloud服务的拆分与远程调用微服务调用方式 Eureka提供者和消费者架构搭建Eureka服务注册服务发现 Ribbon负载均衡饥饿加载总结 Nacos注册中心Nacos安装…

前端React篇之React的生命周期有哪些?

目录 React的生命周期有哪些?挂载阶段(Mounting)更新阶段(Updating)卸载阶段(Unmounting)错误处理阶段(Error Handling) React常见的生命周期React主要生命周期 React的生…

【List集合】List接口源码解读一(ArrayList)

目录 前言 1. List接口的基本信息 2. ArrayList 2.1.ArrayList 的基本信息 2.2. ArrayList 的构造方法 2.2.1 ArrayList 的构造方法一 2.2.2 ArrayList 的构造方法二 2.2.3 ArrayList 的构造方法三 2.3 ArrayList 的扩容方式 总结 前言 Java 语言由于其跨平台、社区良…

微信小程序开发系列(三十四)·自定义组件的创建、注册以及使用(数据和方法事件的使用)

目录 1. 分类和简介 2. 公共组件 2.1 创建 2.2 注册 2.3 使用 3. 页面组件 3.1 创建 3.2 注册 3.3 使用 4. 组件的数据和方法的使用 4.1 组件数据的修改 4.2 方法事件的使用 1. 分类和简介 小程序目前已经支持组件化开发,可以将页面中的功能…

Three 材质纹理 (总结三)

THREE.MeshLambertMaterial(网格 Lambert 材质) 该材质使用基于非物理的Lambertian模型来计算反射率。可以用来创建暗淡的并不光亮的表面,该材质非常易用,而且会与场景中的光源产生反应。 MeshLambertMaterial属性 # .color : …

24年上半年英语四六级报名时间25地汇总一览表

目前有25地公布了报名时间,大多集中在3月中下旬,具体时间以学校通知为准。 7个省份官宣 • 贵州(官方):3月18日12:00-3月29日16:00 • 黑龙江(官方):3月18日14:00-3月29日17:00 • 江西(官方):3月19日6:00-3月25日17:0…

05.BOM对象

一、js组成 JavaScript的组成 ECMAScript: 规定了js基础语法核心知识。比如:变量、分支语句、循环语句、对象等等 Web APIs : DOM 文档对象模型, 定义了一套操作HTML文档的APIBOM 浏览器对象模型,定义了一套操作浏览器窗口的API 二、windo…

deepseek-coder模型量化

1 简介 DeepSeek-Coder在多种编程语言和各种基准测试中取得了开源代码模型中最先进的性能。 为尝试在开发板进行部署,首先利用llama.cpp对其进行量化。 2 llama.cpp安装 git clone之后进入文件夹make即可,再将依赖补全pip install -r requirements.tx…

【Miniconda】基于conda避免运行多个PyTorch项目时发生版本冲突

【Miniconda】基于conda避免运行多个PyTorch项目时发生版本冲突 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到…

原创 《vtk9 book》 官方web版 第四章 - 可视化管线(1 / 2)

在前一章中,我们使用简单的数学模型创建了图形图像,用于光照、视图和几何。光照模型包括环境光、漫反射和镜面效果。视图包括透视和投影的效果。几何被定义为一组静态的图形原语,如点和多边形。为了描述可视化过程,我们需要扩展我…

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记12_移动平台(上)

1. 广告 1.1. 广告收入的来源 1.1.1. 向客户推荐广告投放网址 1.1.2. 提供有效提高产品广告点击率的咨询服务 1.1.3. 从合作伙伴的广告收入中捞上一笔 1.2. 对于广告主来讲,他们无意于与各家网站逐一谈判 1.2.1. 这种方式一是成本过高,二是费时费力…

Github 2024-03-17 php开源项目日报 Top9

根据Github Trendings的统计,今日(2024-03-17统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目9Blade项目2Laravel:表达力和优雅的 Web 应用程序框架 创建周期:4631 天开发语言:PHP, BladeStar数量:75969 个Fork数量:24281 次关…

Delphi7应用教程学习1.3【练习题目】:文本及悬停文字的显示

这个例子主要用到了btn的Hint 属性,Hint是提示的意思。 还有Delphi7还是很好用的,改变了的属性是粗体,默认没有改变的属性为细体。

力扣新思路题:字符串轮转

非常简单的思路:将两个字符串s1接起来,并判断s2字符串是否是加长版s1字符串的子串 bool isFlipedString(char* s1, char* s2){if (strlen(s1) ! strlen(s2)) {return false;}int len strlen(s1);int i 0;char* arr (char*)malloc(sizeof(char) * len…

深入理解RAG:检索与生成的融合

原文地址:https://dev.to/portkey/understanding-rag-a-deeper-dive-into-the-fusion-of-retrieval-and-generation-1l4b 深入理解RAG:检索与生成的融合 检索增强生成(RAG)模型代表了检索系统和生成模型两大不同但互补组件完美结合的杰作。通过无缝集成相关信息检…

(x+2y+3z+4w)^4展开式经过合并同类项之后,xyzw的系数为?

求的展开式经过合并同类项之后,的系数 根据二项式定理,的系数为:

HarmonyOS NEXT应用开发—视频全屏切换案例

介绍 本示例介绍了Video组件和ohos.window接口实现媒体全屏的功能。 该场景多用于首页瀑布流媒体播放等。 效果图预览 使用说明: 点击全屏按钮,横屏媒体窗口。点击恢复窗口按钮,恢复媒体窗口。 实现步骤 在Video组件内调用 onFullscreen…