• 等级
  • 500440 访问
  • 255 原创
  • 1 转发
  • 4459 排名
  • 238 评论
  • 266 获赞

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

D3D12渲染技术之帧资源

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

2018-09-19 09:10:07

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

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

2018-09-18 09:30:12

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

D3D12渲染技术之编译Shader

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

2018-09-17 08:48:47

D3D12渲染技术之常量缓冲区

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

2018-09-16 13:45:56

D3D12渲染技术之像素着色器

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

2018-09-15 13:03:56

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

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

2018-09-15 10:45:40

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

D3D12渲染技术之绘制网格

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

2018-09-13 13:48:25

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

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

2018-09-12 10:39:29

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

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

2018-09-11 14:55:41

D3D12渲染技术之渲染管线

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

2018-09-10 09:12:43

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

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

2018-09-10 09:03:44

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

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

2018-09-09 08:23:54

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

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

2018-09-07 09:41:09

博客专家

海洋_

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