自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

海洋个人博客

喜欢自由的飞翔!

  • 博客(334)
  • 收藏
  • 关注

原创 D3D12渲染技术之混合

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

2018-10-14 10:12:42 1420

原创 D3D12渲染技术之地形和水

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

2018-10-12 13:37:21 1135

原创 D3D12渲染技术之纹理案例

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

2018-10-11 09:39:08 1145

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

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

2018-10-10 13:35:38 877

原创 D3D1渲染技术之采样

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

2018-10-08 10:07:41 1183

原创 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 819

原创 D3D12渲染技术之过滤

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

2018-10-05 09:14:28 711

原创 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 1696

原创 D3D12渲染技术之纹理数据源

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

2018-09-30 09:46:07 1108

原创 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 1404

原创 D3D渲染技术之纹理

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

2018-09-28 10:56:48 1886

原创 D3D12渲染技术之光源

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

2018-09-27 17:58:08 718

原创 D3D12渲染技术之向量法线

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

2018-09-25 09:51:14 903

原创 D3D12渲染技术之灯光

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

2018-09-24 10:29:38 602

原创 D3D12渲染技术之网格地形

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

2018-09-23 16:14:58 1029

原创 D3D12渲染技术之根签名

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

2018-09-22 14:27:58 2338

原创 D3D12渲染技术之形状几何

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

2018-09-21 13:46:45 684

原创 D3D12渲染技术之渲染

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

2018-09-20 14:39:53 1093

原创 D3D12渲染技术之帧资源

在前面博客中,我们要让CPU和GPU并行工作, CPU构建并提交命令列表(除了其他CPU工作之外),GPU处理命令队列中的命令, 目标是让CPU和GPU忙碌,以充分利用系统上可用的硬件资源。 到目前为止,在我们的演示中,我们已经每帧同步CPU和GPU一次, 为什么这是必要的两个例子是: 1、在GPU完成执行命令之前,不能重置命令分配器, 假设我们没有进行同步,以便CPU在GPU处理完当前帧n之前...

2018-09-19 09:10:07 1428

原创 D3D12渲染技术之几何辅助结构

我们绘制一个立方体需要一组顶点和索引,将顶点和索引缓冲区组合在一起可以定义一组几何图形的结构, 此外,该结构的顶点和索引数据是在系统内存中的,以便CPU可以读取它, CPU需要访问几何数据以进行拾取和碰撞检测。 每当我们定义几何时,我们使用以下MeshGeometry(在d3dUtil.h中定义)结构。...

2018-09-18 09:30:12 662

原创 D3D12渲染技术之光栅化与管道

光栅化状态虽然渲染管道的许多部分都是可编程的,但某些部分只是可配置的。 由D3D12_RASTERIZER_DESC结构表示的光栅化器状态组用于配置渲染管道的光栅化阶段:typedef struct D3D12_RASTERIZER_DESC {D3D12_FILL_MODE FillMode; // Default: D3D12_FILL_SOLID D3D12_CULL_MO...

2018-09-17 13:42:22 885

原创 D3D12渲染技术之编译Shader

很多人只知道写Shader,但是并不了解DX或者OpenGL是如何编译Shader的,我们写的Shader是一种文本文件,它可以被DX或者OpenGL读取,说明它们提供了接口编译Shader。3D引擎都与DX或者OpenGL相关的,本篇博客就给读者介绍如何编译Shader的。 在Direct3D中,必须首先将着色器程序编译为可移植字节码, 然后,图形驱动程序将采用此字节码并将其再次编译为系统GP...

2018-09-17 08:48:47 4006

原创 D3D12渲染技术之常量缓冲区

常量缓冲区是GPU资源(ID3D12Resource)的示例,其数据内容可以在着色器程序中引用。 正如我们将在博客中学到的,纹理和其他类型的缓冲区资源也可以在着色器程序中引用。顶点着色器具有以下代码:cbuffer cbPerObject : register(b0){ float4x4 gWorldViewProj; };此代码引用名为cbPerObject的cbuffer对...

2018-09-16 13:45:56 3166

原创 D3D12渲染技术之像素着色器

再介绍一下片段着色器,在光栅化期间,从顶点着色器(或几何着色器)输出的顶点属性在三角形的像素上进行插值。 然后将插值作为输入,输入到像素着色器。 假设没有几何着色器,下图说明了到目前为止顶点数据的路径。 每个顶点元素都有一个由D3D12_INPUT_ELEMENT_DESC数组指定的相关语义。 顶点着色器的每个参数也具有附加的语义。 语义用于将顶点元素与顶点着色器参数进行匹配。 同样地,顶点...

2018-09-15 13:03:56 1093

原创 谈谈程序员如何快速提升职业技能

IT行业有很多分支:AI,大数据,区块链,游戏等等,其中游戏开发由于Unity引擎的普及入门门槛很低,收入相对来说比较高,导致了大量的应届毕业生或者说其他IT行业的人转到游戏开发中,游戏开发涉及到的技术也是很多的,其中包括很多算法:四叉树,八叉树,Bezier,A* 算法,人工智能,行为树,高斯,图形学算法等等。要想在IT行业立于不败之地,我们需要缩短与高手之间的差距,怎么去弥补这个差距呢?这里说...

2018-09-15 10:45:40 5875

原创 D3D12渲染技术之顶点着色器

相信大家以前用过D3D9的或是编写过Shader的对顶点着色器都比较了解,现在我们回顾一下:cbuffer cbPerObject : register(b0){ float4x4 gWorldViewProj; };void VS(float3 iPosL : POSITION, float4 iColor : COLOR, out float4 oPos...

2018-09-14 08:34:52 1671 1

原创 D3D12渲染技术之绘制网格

在前几篇博客中,我们主要关注渲染管道的概念和数学方面。 反过来,从本篇博客开始重点介绍配置渲染管道,定义顶点和像素着色器以及将几何图形提交到渲染管道以进行绘制所需的Direct3D API接口和方法。 学习配置渲染管道,对于学习Unity的自定义渲染管线有很大帮助,它们的原理类似的,做到举一反三。学习目标:1、掌握用于定义,存储和绘制几何数据的Direct3D接口方法。 2、学习如何...

2018-09-13 13:48:25 2029 2

原创 手把手教你架构3D引擎高级篇系列四

第三方库已经完成,接下来我们要考虑引擎架构的事情了,架构一款从无到有的引擎,从哪里下手呢?面对架构一款比较庞大的引擎,建议先从引擎的内存管理入手,因为内存是跟硬件相关的,它也是引擎的心脏,处理不好,引擎会经常崩溃的。还有因为引擎的代码量比较大,这里只把核心的代码给读者展示,如果全部展示信息量太庞大。再编写引擎的内存管理之前,我们可以研究一下网上的一些经典引擎的内存管理。内存管理先看看O...

2018-09-12 10:39:29 1303

原创 手把手教你架构3D引擎高级篇系列三

Unity对于开发者来说是一个黑盒子,开发者只需掌握引擎提供的脚本语言,能够熟练运用就可以了,这导致了现在很多程序员对于C++编程或者说对于引擎只会一些表面的东西,深入的一概不知。久而久之,你就只是一个脚本程序员,你能做的事情别人也能做,对于公司来说你就属于可有可无的,薪资方面不会有大的长进,随时可以被替代,而且对于个人发展也是不利的。为了自己的前途着想还是要学点引擎底层的技术,其实学习引擎对于写...

2018-09-11 14:55:41 2694 1

原创 D3D12渲染技术之渲染管线

渲染管线指的是基于虚拟相机看到的内容生成2D图像所需的整个步骤序列,在博客D3D12渲染技术概述中介绍过渲染管线,本篇博客具体讲解各个模块的作用,先看下图所示: Input Assembler Stage上图中Input Assembler Stage表示的是从存储器读取几何数据(顶点和索引)并使用它来组装几何图元(例如,三角形,线条)。 (简单地说,它们定义了如何将顶点组合在一起以...

2018-09-10 09:12:43 1193

原创 手把手教你架构3D引擎高级篇系列二

系列一给读者介绍了我们查阅的相关资料,下面我们需要选择引擎的渲染库了,在这里先谈谈我对引擎的学习: 上图是我做项目用过的或者说自学所用到的引擎,我刚开始接触引擎是在读研究生的时候,是实验室自研的引擎,是为项目开发定制的,功能现在来说是比较陋的,后来我先接触的是Ogre引擎,利用它也做过一些小Demo,进入公司后,使用的是公司自研引擎开发的项目,再后来接触鬼火引擎,这款引擎代码编写简单,新手学...

2018-09-10 09:03:44 1997

原创 手把手教你架构3D引擎高级篇系列一

最近一段时间事情比较多,从本篇博客开始,我手把手教大家如何开发一款类似商业引擎Unity的开发,我们在这里要阅读学习一些编写引擎的知识,编写引擎之前,我们需要安装Visual Studio VS2017,Windows操作系统是64位的,编程语言是C++,我们的引擎会使用比如Lua,C#都可以使用,这也是方便后期引擎逻辑的扩展。引擎编程必备知识学习引擎和编写引擎是完全不一样的,学习引擎...

2018-09-09 08:23:54 10788 6

原创 Unity大密度建筑场景加载解决方案

现在虚拟城市仿真,以及军事仿真项目越来越多,开发此类项目,首先面对的一个比较棘手的问题是内存管理,城市中的建筑物特别多,这些建筑物的面数和贴图都要被加到内存中的,内存有自己的峰值,超过了就要崩掉,所以内存的优化是必须要面对以及解决的问题。 Unity官方提供了Occlusion Culling的裁剪操作,网上有很多文章对它做了相关介绍,因为它是Unity自身提供的,对于我们程序员来说就是一个黑盒...

2018-09-07 09:41:09 14384 3

原创 Unity移动端软阴影技术总结

在移动端实现阴影技术可以提升画面品质,我们说的实时阴影也成为软阴影,鉴于移动端硬件的限制,一些复杂的算法比如PSSM,CSM等不可能在移动端去实时,我们只能找一种捷径,既能把实时阴影实现出来,效率还要正常运行。本篇博客把市面上比较流行的在移动端运行的算法或者阴影插件给读者汇总一下,以便读者在项目开发中能够灵活的运用这些代码。另外,也给读者推荐一个抓取帧数据的非常实用的一个工具:Adreno Pro...

2018-09-06 08:17:03 10425 1

原创 D3D渲染技术之简易框架

在上一篇博客中,我们介绍了D3D12初始化流程实现过程,本篇博客我们搭建一个简易的迷你型小框架用于实现我们的初始化流程,在游戏编程中,我们都需要定时器的封装,比如骨骼动画需要,联网也需要定期判断是否短线,断线后多久开始重连,帧的时间间隔等等,可见时间定时器是很重要的,在这里我们未雨绸缪也实现一个定时器,为了准确测量时间,我们使用性能计时器(或性能计数器), 要使用Win32函数查询性能计时器,我们...

2018-09-04 16:52:05 2637 4

原创 D3D12渲染技术之初始化流程

掌握了矩阵向量运算的实现后,接下来我们要做的事情运行我们的D3D12,看看会出现什么效果?也就是我们通常说的初始化D3D12,D3D12的初始化工作与以前的D3D9是完全不一样的,D3D12做了大幅的升级。但是每个D3D图形API都有自己的初始化流程,大家只要记住这个流程,学习起来就比较容易,就跟生产车架的流水线作业一样的原理,先做什么后做什么。我们先聊聊D3D12的初始化流程,然后再编程实现。...

2018-08-23 14:12:47 5123

原创 D3D12渲染技术之矩阵向量运算

向量,矩阵运算这个是老生常谈的话题了,作为程序员来说必须要掌握的,游戏开发逻辑编写中用的最多的也是矩阵向量相关的运算,向量矩阵运算它也是引擎的最基础部分,几乎每个引擎都会封装自己的向量运算类,矩阵运算类,Unity引擎它也封装了自己的矩阵向量类,虚幻也是一样的。学习D3D12,它们也是绕不过去的,大学的课本《线性代数》主讲的就是它们,如果大家没有学习过或者是跨行业的,可以学习一下。如果大家已经掌握...

2018-08-22 18:38:51 1026 1

原创 D3D12渲染技术概述

从D3D9到D3D12逐步提升,现在很多以前的引擎还是停留在D3D9或者D3D11,D3D12用的比较少,相信不久的将来,引擎使用的D3D API都会更新到D3D12,为了普及D3D API的开发,会做一个系列文章用于介绍D3D12的特色和应用。由浅入深,逐步讲解,不论做游戏还是做VR,AR都会涉及到渲染,很多公司会针对自己的项目封装一些图形接口用于渲染,掌握D3D12很重要的,回到正题,因为D3...

2018-08-22 09:27:03 6332

原创 在Unity中使用四叉树算法绘制地形

四叉树算法在游戏中获得了广泛的应用,前几年3D引擎实现的地形绘制大部分都是用四叉树生成的,因为移动端在硬件方面的限制,我们的地形使用的是美术自己制作的地形,对于程序来说省去了不少工作量,但是作为程序开发者尤其是想从事引擎开发的程序员,我们还是要自己实现一遍四叉树算法的,其实网上很多资料都有C++ OpenGL或者C++ DX实现的四叉树地形。很多引擎的地形它也是在四叉树的基础上改进而成,如果我们想...

2018-08-21 10:36:38 7600 4

原创 谈谈Unity实体组件ECS与Jobs System

Unity2018版本提供了ECS和Jobs System功能,网上也有很多这方面的技术介绍,本篇博客从Unity架构优化的角度给读者介绍关于ECS和Jobs System的使用,结合着实际案例希望让读者更容易理解它们。 Unity 实体组件系统和 C# Job System 是两个不同的系统,但它们密不可分,若要了解这两个系统,我们先看看在 Unity 场景中创建游戏对象的工作流程如下所示:...

2018-08-20 13:16:51 16657 9

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除