• 等级
  • 553591 访问
  • 295 原创
  • 1 转发
  • 3643 排名
  • 257 评论
  • 281 获赞

手把手教你架构3D引擎高级篇系列五

内存管理给读者介绍完了,其实我们只是简单的用了一个HashTable哈希表对资源做了一个统一管理,哈希表系统有自己的封装,因为我们是自己写引擎,在此我们自己实现了一遍,自己封装的优点是便于控制,缺点是要优化好效率问题。我们的Hash表采用了迭代器的形式,由于该类代码量比较大,在此只把关键的几个函数显示一下,其他内容读者可自行查看。说说它的设计思想,我们实现时,并不是简单的实现一个数据结构,而是将它...

2018-11-07 10:58:47

D3D渲染技术之混合案例

在本篇内容中,我们将介绍用于获得特定效果的一些混合因子组合, 在这些示例中,我们仅查看RGB混合。 Alpha混合的处理方式类似。 无颜色写入 假设我们想要保持原始目标像素的原样,而不是覆盖它或将其与当前光栅化的源像素混合。 这可能很有用,例如,如果您只想写入深度/模板缓冲区,而不是后台缓冲区。 为此,请将源像素混合因子设置为D3D12_BLEND_ZERO,将目标混合因子设置为D3D12_BLE...

2018-11-05 09:57:01

D3D12渲染技术之混合

本篇博客给读者介绍混合,见下图所示, 我们首先绘制地形,然后绘制木箱,然后将地形和板条箱像素放在后面的缓冲区上。 我们使用混合将水面绘制到后面的缓冲区,以便水像素与地形混合,并在后面缓冲区上放置像素,使地形和板条箱通过水显示。 从本篇博客开始,我们将研究混合技术,这些技术允许我们将当前光栅化的像素(所谓的源像素)与先前光栅化到后缓冲区的像素(所谓的目标像素)混合(组合)。 除了上面我们提到的,这种...

2018-10-14 10:12:42

D3D12渲染技术之地形和水

在这个案例中,我们为山和水场景添加纹理, 第一个关键问题是我们在地上铺设草纹理, 因为地网格是一个大的表面,如果我们简单地在其上拉伸纹理,那么使用较少的纹理像素将覆盖每个三角形。 换句话说,表面没有足够的纹理分辨率; 我们会得到放大的纹理,因此,我们在地网格上重复草纹理以获得更高的分辨率。 第二个关键问题是我们使用时间函数模拟水波纹的滚动, 这种增加的运动使水效果更佳。 下图显示了演示的屏幕截图。...

2018-10-12 13:37:21

D3D12渲染技术之纹理案例

我们现在回顾一下将纹理添加到箱子模型上面,就跟以前的博客中提到的那样。下面我们详细介绍如何实现? 指定纹理坐标 GeometryGenerator :: CreateBox生成箱子的纹理坐标,以便将整个纹理图像映射到箱子的每个面上。 为简洁起见,我们仅显示正面,背面和顶面的顶点定义。 另请注意,我们省略了顶点构造函数中法线和切线向量的坐标(纹理坐标以粗体显示)。 GeometryGenerator...

2018-10-11 09:39:08

D3D12渲染技术之在着色器中采样

纹理对象在HLSL中定义,并使用以下语法分配给纹理寄存器: Texture2D gDiffuseMap : register(t0); 这个换成在Unity引擎或者UE4引擎中就是提供的可视化操作界面,而在DX中的表示是按照上面的写法,这样可以通过引擎对其进行赋值操作。 请注意,纹理寄存器使用由tn指定,其中n是标识纹理寄存器槽的整数,根签名定义指定从slot参数到着色器寄存器的映射, 这是应用...

2018-10-10 13:35:38

D3D1渲染技术之采样

在前面的博客,我们看到除了纹理数据之外,还有两个与使用纹理相关的关键概念:纹理过滤和寻址模式。 采样纹理资源时使用的过滤器和寻址模式由采样器对象定义, 应用程序通常需要多个采样器对象以不同方式对纹理进行采样。 创建采样器 正如我们将在下面看到的,采样器用于着色器, 为了将采样器绑定到着色器以供使用,我们需要将描述符绑定到采样器对象。 以下代码显示了示例根签名,以便第二个槽采用绑定到采样器寄存器槽0...

2018-10-08 10:07:41

D3D12渲染技术之寻址模式

结合常数或线性插值的纹理定义了矢量值函数T(u,v)=(r,g,b,a), 也就是说,给定纹理坐标(u,v)∈[0,1] ,纹理函数T返回颜色(r,g,b,a)。 Direct3D允许我们以四种不同的寻址方式(称为地址模式):wrap,border color,clamp和mirror。 1、wrap通过在每个整数链接处重复图像来扩展纹理函数(参见下图所示)。 2、border color通过将...

2018-10-07 10:19:20

D3D12渲染技术之过滤

纹理贴图的元素应该被认为是来自连续图像的离散颜色样本,它们不应该被认为是带有区域的矩形。所以问题是:如果我们的纹理坐标(u,v)与其中一个纹素点不一致,会发生什么?这可能发生以下情况。假设播放器放大场景中的墙壁,使墙壁覆盖整个屏幕,例如,假设显示器分辨率为1024×1024,墙壁的纹理分辨率为256×256,这说明纹理放大 - 我们试图用几个纹素覆盖许多像素,在我们的例子中,每个texel点之间有...

2018-10-05 09:14:28

D3D12渲染技术之创建和启用纹理

加载DDS文件 Microsoft提供了轻量级源代码来加载DDS文件: https://github.com/Microsoft/DirectXTK/wiki/DDSTextureLoader 但是,代码仅支持DirectX 11,我们修改了DDSTextureLoader.h / .cpp文件并为DirectX 12提供了另一种方法(这些修改过的文件可以在Common文件夹中找到或者 可下载的来...

2018-10-04 09:11:49

D3D12渲染技术之纹理数据源

为游戏创建纹理的最流行的方法是让美工在Photoshop或其他图像编辑器中制作它们,然后将它们保存为图像文件,如BMP,DDS,TGA或PNG。 然后游戏应用程序将加载时的图像数据加载到ID3D12Resource对象中, 对于实时图形应用程序,DDS(DirectDraw表面格式)图像文件格式是首选,因为它支持GPU本身理解的各种图像格式; 特别是,它支持可由GPU解压缩的压缩图像格式。 美工不...

2018-09-30 09:46:07

D3D12渲染技术之纹理坐标

Direct3D使用纹理坐标系,该坐标系包含一个水平延伸到图像的u轴和一个垂直于图像运行的v轴。 坐标(u,v)使得0≤u,v≤1,识别纹理上称为纹素的元素。 请注意,v轴在“向下”方向上为正(见下图)。 另外,请注意使用的归一化坐标间隔[0,1],因为它为Direct3D提供了与维度无关的范围;例如,无论实际纹理尺寸是256×256,512×1024还是2048×2048像素,(0.5,0.5)...

2018-09-29 09:55:14

D3D渲染技术之纹理

纹理映射是一种允许我们将图像数据映射到三角形上的技术,从而使我们能够显着增加场景的细节和真实感。 例如,我们可以通过在每一侧绘制板条纹理来构建一个立方体并将其转换为板条箱下图所示。 在这里给读者再回顾一下如何学习纹理技术: 1、要了解如何指定映射到三角形的纹理部分。 2、了解如何创建和启用纹理。 3、了解如何过滤纹理以创建更平滑的图像。 4、要了解如何使用地址模式多次平铺纹理。 5、了解如何组合...

2018-09-28 10:56:48

D3D12渲染技术之光源

灯光有Point光源,Spot光源,Directional光源,Area光源等等,网上这方面的文章很多,在此我们就不详细介绍每个光源的计算公式了,我们直接介绍将光源应用到我们的案例中。先看我们已经实现好的案例截图: 顶点格式 照明计算需要表面法线, 我们在顶点级别定义法线; 然后在三角形的像素上插入这些法线,以便我们可以对每个像素进行光照计算。 而且,我们不再指定顶点颜色, 相反,通过对每个像素...

2018-09-27 17:58:08

D3D12渲染技术之向量法线

面法线是描述多边形面向的方向的单位矢量(即,它与多边形上的所有点正交); 表面法线是与表面上的点的切平面正交的单位矢量; 观察表面法线确定表面上的点“朝向”的方向。上面说的两点分别见下图所示: (a)面部法线与面部上的所有点正交。 (b)表面法线是与表面上的点的切平面正交的矢量。 对于光照计算,我们需要在三角形网格表面上求每个点的曲面法线,以便我们可以确定光线照射到网格曲面上的点的角度。 为了...

2018-09-25 09:51:14

D3D12渲染技术之灯光

灯光在引擎中占用重要地位,引擎没有灯光就是漆黑一片,见下图,左边我们有一个没有照明的球体,在右边,我们有一个点亮的球体。 正如你所看到的,左边的球体看起来很平坦 - 也许它根本不是一个球体,而只是一个2D圆圈! 另一方面,右边的球体确实看起来是3D - 照明和阴影有助于我们对物体的固体形状和体积的感知。 事实上,我们对世界的视觉感知取决于光线及其与材料的相互作用,因此,产生逼真场景的大部分问题都与...

2018-09-24 10:29:38

D3D12渲染技术之网格地形

本篇博客我们将展示一个案例, 该案例实现在程序上构造三角形网格,通过偏移顶点高度以创建地形。 此外,使用另一个三角形网格来表示水,并设置顶点高度的动画以创建波浪。 此案例还切换到使用根描述符作为常量缓冲区,这允许我们放弃对CBV的描述符堆的支持。 我们用函数y = f(x,z)实现表面, 通过在xz平面构建网格来近似表面,其中每个四边形由两个三角形构成,然后将函数应用于每个网格点; 见下图:...

2018-09-23 16:14:58

D3D12渲染技术之根签名

我们在前面的博客中介绍了根签名, 根签名定义在发出绘制调用之前需要将哪些资源绑定到管道以及这些资源如何映射到着色器输入寄存器, 需要绑定哪些资源取决于当前着色器程序所期望的资源, 创建PSO时,将验证根签名和着色器程序组合。 根参数 回想一下,根签名是由一组根参数定义的, 到目前为止,我们只创建了一个存储描述符表的根参数, 但是,root参数实际上可以是以下三种类型之一: 1、描述符表:...

2018-09-22 14:27:58

D3D12渲染技术之形状几何

在本篇博客中,我们将展示如何为椭圆体,球体,圆柱体和圆锥体创建几何体。 这些形状对于绘制天空圆顶,调试,可视化碰撞检测和延迟渲染非常有用。 例如,我们可能希望将所有游戏角色渲染为调试测试的球体。 我们将过程几何生成代码放在GeometryGenerator类(GeometryGenerator.h / .cpp)中,GeometryGenerator是一个实用程序类,用于生成简单的几何形状,如网...

2018-09-21 13:46:45

D3D12渲染技术之渲染

绘制对象需要设置多个参数,例如绑定顶点和索引缓冲区,绑定对象常量,设置基元类型以及指定DrawIndexedInstanced参数。 当我们开始在场景中绘制更多对象时,创建一个存储绘制对象所需数据的轻量级结构会很有帮助。 这些数据因应用程序而异,因为我们添加了需要不同绘图数据的新功能。 我们将提交完整绘制所需的数据集称为渲染管道渲染项。 对于此演示,我们的Render Item结构如下所示: ...

2018-09-20 14:39:53

博客专家

海洋_

CSDN社区专家,IT高级讲师,畅销书作者,著作: 《手把手教你3D游戏引擎架构》、《Unity3D实战核心技术详解》,《Cocos2d-x 3.x 图形学渲染技术讲解》等。 ...展开 收起
关注
  • 网络游戏/技术合伙人
  • 中国
奖章
  • 博客专家
  • 专栏达人
  • 持之以恒