Direct3D地形绘制基础

news2024/11/27 18:49:15

高度图

用高度图来描述地形中的丘陵和山谷,高度图其实就是一个数组,该数组每个元素都指定了地形方格中某一个特定顶点的高度值。通常将高度图视为一个矩阵,这样高度图中的元素就与地形栅格中的顶点一一对应。

高度图被保存在磁盘中,通常为其每个元素元素只分配一个字节存储空间,这样高度只能在区间
[0,255]内取值,但在实际应用中为了匹配3D世界的尺度,可能需要对高度值进行比例变换,这样就极可能超出上述区间。基于上述原因,当将高度数据加载到应用程序中时,我们重新分配一个整型或浮点型数组来存储这些高度值。

创建高度图

可由编程序生成、可用图像编辑软件来创建,一旦完成高度图的创建,我们需要将其保存为8位的RAW文件。RAW文件仅连续存储了图像中以字节为单位的每个像素的灰度值。这就使得这类文件的读取操作非常容易。您使用的图像编辑软件可能会询问您是否要为RAW文件增加一个文件头,请选择“否”.

加载RAW文件

RAW文件本质上是一个连续的字节存储块,其中将字节型向量复制到一个整型向量中,我们就可对高度值进行比例变换从而突破0~255的限制,该方法的唯一限制是所要读取的RAW文件中包含的字节数至少要与地形中的顶点总数一样多,所以,如果您要从一个256×256的RAW文件中读取数据,相应地您只能创建一个至多有256×256个顶点的地形。

bool Terrain::ReadRawFile(std::string fileName)
{
	//RAW文件本质上是一个连续的字节存储块
	//限制RAW文件尺寸必须>=地形的尺寸,一个128x128的RAW文件只能用于最多128x128的顶点

	std::vector<BYTE> in(_numVertices);
	std::ifstream inFile(fileName.c_str(), std::ios_base::binary);
	if (!inFile)
		return false;
	inFile.read((char*)&in[0], in.size());
	inFile.close();

	_heightmap.resize(_numVertices);
	for (int i = 0; i < in.size(); ++i)
		_heightmap[i] = in[i];

	return true;
}

创建地形几何信息

可通过指定每行和每列的顶点数以及单元间距(cell spacing)来定义地形的尺寸。这些值将作为Terrain类的构造函数的传入参数。此外,
我们对该类的构造函数还传入了与地形相关的设备指针、一个标识了存储高度图数据的文件的字符串,以及一个用于对高度图中各元素实施比例变换的高度比例因子

顶点的计算

为了计算三角形栅格的各顶点,我们只需自顶点start起,逐行生成每个顶点,保持相邻顶点的行列间隔均为单元间距(cell spacing),直至到达顶点end为止。这样就给出了x和z坐标的定义。y坐标则要查询所加载的高度图数据结构中的相应项。

为了计算纹理坐标,请参考图13.5,该图给出了一个简单的纹理图像,从中我们可以看出与地形中位于(i,j)的顶点相对应的纹理坐标(u,v)可由下述公式计算得到:

其中uCoordIncrementSize=\frac{1}{numCellCols}      vCoordIncrementSize=\frac{1}{numCellRows}

索引的计算

为计算三角形栅格各顶点的索引,我们只需自图13.4的左上角起直至右下角,依次遍历每个方格,
并计算构成每个方格的三角面片的顶点索引。

计算的关键是推导出一个用于求出构成第i行、第j列的方格的两个面片的顶点索引的通用公式。借
助图13.6,我们可自行推导该公式,我们发现,对于处在(i,j)位置的方格

纹理映射

1.加载一个已创建好的纹理文件,然后再用于该纹理数据
2.创建一个“空”纹理,按顺序生成纹理数据,先用D3DXCreateTexture创建一个空纹理,然后再将顶层纹理锁定,自此开始遍历每个纹理元并对其上色。上色的依据是坐标方格所对应的近似高度。思路是:地形中海拔较低的部分上色为沙滩色,中等海拔的部分上色为绿色的丘陵颜色,高海拔的部分上色为雪山的颜色。我们用坐标方格中左上角顶点的高度值近似表示该方格的整体高度

光照

为了给地形添加光照以增强真实感。由于前面已经计算好了地形纹理的颜色,现在我们只需计算地形中各部分在给定光源照射下应如何进行明暗调整的明暗因子(shade factor),不用Direct3D来添加光照而是自己手动计算。这样做主要是基于下述考虑:

  • 手工计算由于无需存储顶点法向量,所以可以节省大量内存。
  • 山于地形是静态的,而且光源一般也不发生移动,所以我们可以预先对光照进行计算,这样就节省了Direct3D实时照亮地形那部分计算时间。
  • 手工计算方式使得我们获得了将相关数学知识付诸实践的机会,并有助于我们加深对基本的光照概念的理解以及熟悉Direct3D中的一些函数

我们在计算地形的明暗时用到的光照技术很基本也很常用,即漫射光光照(diffusing lighting)。给定
一个平行光源,我们用到达光源的方向(该光源发出的平行光的传播方向的反方向)来描述该平行光源。如果一组平行光线自空中沿着方向lightRaysDirection=(0,-1,0)向下照射,则到达光源的方向应与lightRaysDirection相反,即directionToLight=(0,1,0)。注意,光的方向向量应为单位向量。虽然指定光的出射方向好像更符合直觉,但指定到达光源的方向更适合漫射光光照的计算

由图137可见,上述夹角越大,坐标方格的朝向偏离光源就越大,其所接收到的光照就越少。反之,上述夹角越小,坐标方格的朝向偏离光源就越小,

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

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

相关文章

爬虫试用 | 京东商品详情搜索采集助手 – 一键批量采集下载商品详情

商品详情页&#xff08;链接中可获取商品ID&#xff09; API接口调用代码 Request address: https://api-服务器.cn/jd/item_get/?key【你的key】& &num_iid10335871600&cacheno&&langzh-CN&secret【你的密钥】 点此获取APIkey和secret 响应示例…

【微观经济学】Consumer Theory

1.Preference 1) Preferences assumption a. completeness&#xff1a;对每一个东西都有一个确定的偏好&#xff0c;不能说不确定 b. transitivity c. nonsatiation&#xff1a;more is better 2) Utility function 使用效用函数来刻画消费者的偏好 例如 拿这个效用函数…

web —— html

Web —— css基础 1. HTML2. 基本HTML结构3. HTML常用标签3.1 文本相关标签3.2 HTML图像标签3.3 HTML超链接标签3.4 HTML表&#xff0c;单3.4.1 HTML表格3.4.2 HTML表单&#xff0c;输入框&#xff08;多选框&#xff0c;单选框&#xff09;下拉框 3.5 HTML分区标签3.5.1 div标…

音频文件元数据修改:批量操作的技巧和方法

在音乐产业不断发展和数字技术日益成熟的今天&#xff0c;音频文件已经成为我们日常生活中的重要组成部分。在这些文件中&#xff0c;元数据起着至关重要的作用&#xff0c;它不仅提供了关于音频文件的基本信息&#xff0c;如艺术家、歌曲名称、专辑名称等&#xff0c;还为我们…

速学数据结构 | 我不允许还有人不会用栈实现队列!

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525;个人专栏:《Linux深造日志》《C干货基地》 ⛺️生活的理想&#xff0c;就是为了理想的生活! &#x1f4cb; 前言 &#x1f308;hello&#xff01; 各位铁铁们大家好啊&#xff0c;不知道大家对栈和队列的学习都学过了吧…

LLM之幻觉(一):大语言模型幻觉解决方案综述

论文题目&#xff1a;《Cognitive Mirage: A Review of Hallucinations in Large Language Models》 ​论文链接&#xff1a;https://arxiv.org/abs/2309.06794v1 论文代码&#xff1a;https://github.com/hongbinye/cognitive-mirage-hallucinations-in-llms 一、幻觉介绍 …

【Python报错合集】Python元组tuple、张量tensor(IndexError、TypeError、RuntimeError……)~持续更新

文章目录 IndexError1. tuple index out of rangea. 示例代码b.报错原因c.解决方案 TypeError1. len() of a 0-d tensora. 示例代码b.报错原因c.解决方案 RuntimeError1. output with shape … doesnt match the broadcast shape …a. 示例代码b.报错原因c.解决方案 2. Cant ca…

【C++干货铺】内存管理new和delete

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 C语言中动态内存管理方式 malloc/calloc/realloc的区别&#xff1f; C内存管理的方式 内置类型 自定义类型 operator new 和 operator delete 函数 operato…

Premiere Pro 2024 v24.0

adobe Premiere Pro 2024 Mac版发布了吗&#xff1f;无论您是编辑社交媒体视频还是大电影&#xff0c;Premiere Pro 都可以帮助您借助工具精心创作有意义的故事。导入和编辑&#xff0c;添加效果&#xff0c;然后将素材导出到任何目标。无论您要创作什么内容&#xff0c;它都可…

正点原子嵌入式linux驱动开发——Linux 4G通信

前面学习了如何在Linux中使用有线网络或者WIFI&#xff0c;但是使用有线网络或者WIFI有很多限制&#xff0c;因为要布线&#xff0c;即使是WIFI也得先布线&#xff0c;然后再接个无线路由器。有很多场合是不方便布线的&#xff0c;这个时候就是4G大显身手的时候&#xff0c;产品…

mediapipe流水线分析 二

目标检测 Graph 一 流水线上游输入处理 1 TfLiteConverterCalculator 将输入的数据转换成tensorflow api 支持的Tensor TfLiteTensor 并初始化相关输入输出节点 &#xff0c;该类的业务主要通过 interpreter std::unique_ptrtflite::Interpreter interpreter_ nullptr; 实现…

Ansible入门使用

目录 前言 一、环境概况 修改主机名&#xff08;可选项&#xff09; 二、安装部署 1.安装epel扩展源 2.安装Ansible 3.修改Ansible的hosts文件 4.生成密钥 三、Ansible模块使用介绍 Command模块 Shell模块 User模块 Copy模块 File模块 Hostname模块 Yum模块 Se…

windows下mysql5.7.19批处理安装启动修改密码

有时候要在windows下安装mysql&#xff0c;新手一般觉得复杂&#xff0c;要搞命令行。 于是弄了些批处理&#xff0c;win7 64 测试通过&#xff0c; windows server 2012测试通过 mysql5.7.19 x64版本在windows下的一键安装批处理与mysql解压包 1&#xff0c;无需管理员运…

中国人民大学与加拿大女王大学金融硕士——一把开启未来金融世界的金钥匙

在这个日新月异、竞争激烈的时代&#xff0c;每个人都渴望不断提升自我&#xff0c;以应对不断变化的世界。在当今的金融领域&#xff0c;国际化的视野和多元化的知识结构变得越来越重要。如何才能掌握未来世界的金钥匙呢&#xff1f;其实&#xff0c;这把金钥匙并非遥不可及&a…

北斗升级轨道检查,高精度定位确保铁路畅通无阻

北斗升级轨道检查&#xff0c;高精度定位确保铁路畅通无阻 随着科技的发展&#xff0c;北斗卫星系统在各个领域的应用越来越广泛。其中&#xff0c;在铁路轨道检查中&#xff0c;北斗卫星技术的应用不仅能够提高效率&#xff0c;减少人力成本&#xff0c;还能够保障安全&#x…

变压器试验VR虚拟仿真操作培训提升受训者技能水平

VR电气设备安装模拟仿真实训系统是一种利用虚拟现实技术来模拟电气设备安装过程的培训系统。它能够为学员提供一个真实、安全、高效的学习环境&#xff0c;帮助他们更好地掌握电气设备的安装技能。 华锐视点采用VR虚拟现实技术、MR混合现实技术、虚拟仿真技术、三维建模技术、人…

css布局grid-template-columns属性

grid-template-columns属性可以用于创建一个网格布局&#xff0c;以下是使用此属性的步骤&#xff1a; 首先在网格容器上使用 display: grid; 将其转换为网格容器。 然后使用 grid-template-columns 属性来定义列的数量和大小。例如&#xff0c;使用 “grid-template-columns:…

私域流量搭建与运营,技巧全攻略!

2023年是比拼运营深度和服务效率的一年&#xff0c;用户对于体验的期望值将持续增长&#xff0c;企业需提供无缝的客户体验&#xff0c;以推动增长、保障收入、确保客户忠诚度。在疫情新常态下&#xff0c;企业已构建起APP、小程序等一系列线上触点矩阵&#xff0c;而各个触点之…

承载AI计算的数据中心网络和传统数据中心有何不同?

生成式AI正在风靡全球&#xff0c;不少企业开始研究如何在其业务流程中采用人工智能技术&#xff0c;更有一些企业客户开始考虑在数据中心和私有云中部署自己的AIGC和 GPU 扩展网络。从网络角度来看&#xff0c;用于承载这类业务的数据中心与传统的数据中心有很大不同&#xff…

Qt6远程连接MySQL数据库(简单易上手版)

在对照文章开始操作之前&#xff0c;MySQL 和 Navicat 的安装配置要自己提前弄好。 步骤1&#xff1a; 在电脑桌面任务栏中的搜索框中输入 mysql&#xff0c;找到名为&#xff1a;MySQL 8.0 Command Line Client&#xff0c;然后打开。 步骤2&#xff1a; 输入密码后回车&a…