3D引擎
文章平均质量分 85
海洋_
畅销书作者,著作:《手把手教你3D游戏引擎架构》、《Unity3D实战核心技术详解》,《Cocos2d-x 3.x 图形学渲染技术讲解》等。
展开
-
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 · 1672 阅读 · 1 评论 -
D3D12渲染技术之向量法线
面法线是描述多边形面向的方向的单位矢量(即,它与多边形上的所有点正交); 表面法线是与表面上的点的切平面正交的单位矢量; 观察表面法线确定表面上的点“朝向”的方向。上面说的两点分别见下图所示:(a)面部法线与面部上的所有点正交。(b)表面法线是与表面上的点的切平面正交的矢量。对于光照计算,我们需要在三角形网格表面上求每个点的曲面法线,以便我们可以确定光线照射到网格曲面上的点的角度。 为了...原创 2018-09-25 09:51:14 · 905 阅读 · 0 评论 -
D3D12渲染技术之像素着色器
再介绍一下片段着色器,在光栅化期间,从顶点着色器(或几何着色器)输出的顶点属性在三角形的像素上进行插值。 然后将插值作为输入,输入到像素着色器。 假设没有几何着色器,下图说明了到目前为止顶点数据的路径。 每个顶点元素都有一个由D3D12_INPUT_ELEMENT_DESC数组指定的相关语义。 顶点着色器的每个参数也具有附加的语义。 语义用于将顶点元素与顶点着色器参数进行匹配。 同样地,顶点...原创 2018-09-15 13:03:56 · 1094 阅读 · 0 评论 -
D3D12渲染技术之渲染
绘制对象需要设置多个参数,例如绑定顶点和索引缓冲区,绑定对象常量,设置基元类型以及指定DrawIndexedInstanced参数。 当我们开始在场景中绘制更多对象时,创建一个存储绘制对象所需数据的轻量级结构会很有帮助。 这些数据因应用程序而异,因为我们添加了需要不同绘图数据的新功能。 我们将提交完整绘制所需的数据集称为渲染管道渲染项。 对于此演示,我们的Render Item结构如下所示:...原创 2018-09-20 14:39:53 · 1093 阅读 · 0 评论 -
D3D12渲染技术之纹理案例
我们现在回顾一下将纹理添加到箱子模型上面,就跟以前的博客中提到的那样。下面我们详细介绍如何实现?指定纹理坐标GeometryGenerator :: CreateBox生成箱子的纹理坐标,以便将整个纹理图像映射到箱子的每个面上。 为简洁起见,我们仅显示正面,背面和顶面的顶点定义。 另请注意,我们省略了顶点构造函数中法线和切线向量的坐标(纹理坐标以粗体显示)。GeometryGenerator...原创 2018-10-11 09:39:08 · 1146 阅读 · 0 评论 -
D3D12渲染技术之形状几何
在本篇博客中,我们将展示如何为椭圆体,球体,圆柱体和圆锥体创建几何体。 这些形状对于绘制天空圆顶,调试,可视化碰撞检测和延迟渲染非常有用。 例如,我们可能希望将所有游戏角色渲染为调试测试的球体。 我们将过程几何生成代码放在GeometryGenerator类(GeometryGenerator.h / .cpp)中,GeometryGenerator是一个实用程序类,用于生成简单的几何形状,如网...原创 2018-09-21 13:46:45 · 685 阅读 · 0 评论 -
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 · 1699 阅读 · 0 评论 -
D3D12渲染技术之过滤
纹理贴图的元素应该被认为是来自连续图像的离散颜色样本,它们不应该被认为是带有区域的矩形。所以问题是:如果我们的纹理坐标(u,v)与其中一个纹素点不一致,会发生什么?这可能发生以下情况。假设播放器放大场景中的墙壁,使墙壁覆盖整个屏幕,例如,假设显示器分辨率为1024×1024,墙壁的纹理分辨率为256×256,这说明纹理放大 - 我们试图用几个纹素覆盖许多像素,在我们的例子中,每个texel点之间有...原创 2018-10-05 09:14:28 · 711 阅读 · 0 评论 -
D3D12渲染技术之光源
灯光有Point光源,Spot光源,Directional光源,Area光源等等,网上这方面的文章很多,在此我们就不详细介绍每个光源的计算公式了,我们直接介绍将光源应用到我们的案例中。先看我们已经实现好的案例截图:顶点格式照明计算需要表面法线, 我们在顶点级别定义法线; 然后在三角形的像素上插入这些法线,以便我们可以对每个像素进行光照计算。 而且,我们不再指定顶点颜色, 相反,通过对每个像素...原创 2018-09-27 17:58:08 · 718 阅读 · 0 评论 -
D3D12渲染技术之根签名
我们在前面的博客中介绍了根签名, 根签名定义在发出绘制调用之前需要将哪些资源绑定到管道以及这些资源如何映射到着色器输入寄存器, 需要绑定哪些资源取决于当前着色器程序所期望的资源, 创建PSO时,将验证根签名和着色器程序组合。根参数回想一下,根签名是由一组根参数定义的, 到目前为止,我们只创建了一个存储描述符表的根参数, 但是,root参数实际上可以是以下三种类型之一: 1、描述符表:...原创 2018-09-22 14:27:58 · 2341 阅读 · 0 评论 -
D3D12渲染技术之地形和水
在这个案例中,我们为山和水场景添加纹理, 第一个关键问题是我们在地上铺设草纹理, 因为地网格是一个大的表面,如果我们简单地在其上拉伸纹理,那么使用较少的纹理像素将覆盖每个三角形。 换句话说,表面没有足够的纹理分辨率; 我们会得到放大的纹理,因此,我们在地网格上重复草纹理以获得更高的分辨率。 第二个关键问题是我们使用时间函数模拟水波纹的滚动, 这种增加的运动使水效果更佳。 下图显示了演示的屏幕截图。...原创 2018-10-12 13:37:21 · 1135 阅读 · 0 评论 -
D3D渲染技术之纹理
纹理映射是一种允许我们将图像数据映射到三角形上的技术,从而使我们能够显着增加场景的细节和真实感。 例如,我们可以通过在每一侧绘制板条纹理来构建一个立方体并将其转换为板条箱下图所示。在这里给读者再回顾一下如何学习纹理技术:1、要了解如何指定映射到三角形的纹理部分。2、了解如何创建和启用纹理。3、了解如何过滤纹理以创建更平滑的图像。4、要了解如何使用地址模式多次平铺纹理。5、了解如何组合...原创 2018-09-28 10:56:48 · 1888 阅读 · 0 评论 -
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 · 820 阅读 · 0 评论 -
D3D12渲染技术之混合
本篇博客给读者介绍混合,见下图所示, 我们首先绘制地形,然后绘制木箱,然后将地形和板条箱像素放在后面的缓冲区上。 我们使用混合将水面绘制到后面的缓冲区,以便水像素与地形混合,并在后面缓冲区上放置像素,使地形和板条箱通过水显示。 从本篇博客开始,我们将研究混合技术,这些技术允许我们将当前光栅化的像素(所谓的源像素)与先前光栅化到后缓冲区的像素(所谓的目标像素)混合(组合)。 除了上面我们提到的,这种...原创 2018-10-14 10:12:42 · 1421 阅读 · 0 评论 -
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 · 1406 阅读 · 0 评论 -
D3D1渲染技术之采样
在前面的博客,我们看到除了纹理数据之外,还有两个与使用纹理相关的关键概念:纹理过滤和寻址模式。 采样纹理资源时使用的过滤器和寻址模式由采样器对象定义, 应用程序通常需要多个采样器对象以不同方式对纹理进行采样。创建采样器正如我们将在下面看到的,采样器用于着色器, 为了将采样器绑定到着色器以供使用,我们需要将描述符绑定到采样器对象。 以下代码显示了示例根签名,以便第二个槽采用绑定到采样器寄存器槽0...原创 2018-10-08 10:07:41 · 1185 阅读 · 0 评论 -
D3D12渲染技术之纹理数据源
为游戏创建纹理的最流行的方法是让美工在Photoshop或其他图像编辑器中制作它们,然后将它们保存为图像文件,如BMP,DDS,TGA或PNG。 然后游戏应用程序将加载时的图像数据加载到ID3D12Resource对象中, 对于实时图形应用程序,DDS(DirectDraw表面格式)图像文件格式是首选,因为它支持GPU本身理解的各种图像格式; 特别是,它支持可由GPU解压缩的压缩图像格式。美工不...原创 2018-09-30 09:46:07 · 1111 阅读 · 0 评论 -
D3D12渲染技术之在着色器中采样
纹理对象在HLSL中定义,并使用以下语法分配给纹理寄存器:Texture2D gDiffuseMap : register(t0);这个换成在Unity引擎或者UE4引擎中就是提供的可视化操作界面,而在DX中的表示是按照上面的写法,这样可以通过引擎对其进行赋值操作。请注意,纹理寄存器使用由tn指定,其中n是标识纹理寄存器槽的整数,根签名定义指定从slot参数到着色器寄存器的映射, 这是应用...原创 2018-10-10 13:35:38 · 879 阅读 · 0 评论 -
手把手教你架构3D引擎高级篇系列五
内存管理给读者介绍完了,其实我们只是简单的用了一个HashTable哈希表对资源做了一个统一管理,哈希表系统有自己的封装,因为我们是自己写引擎,在此我们自己实现了一遍,自己封装的优点是便于控制,缺点是要优化好效率问题。我们的Hash表采用了迭代器的形式,由于该类代码量比较大,在此只把关键的几个函数显示一下,其他内容读者可自行查看。说说它的设计思想,我们实现时,并不是简单的实现一个数据结构,而是将它...原创 2018-11-07 10:58:47 · 1447 阅读 · 4 评论 -
D3D渲染技术之混合案例
在本篇内容中,我们将介绍用于获得特定效果的一些混合因子组合, 在这些示例中,我们仅查看RGB混合。 Alpha混合的处理方式类似。无颜色写入假设我们想要保持原始目标像素的原样,而不是覆盖它或将其与当前光栅化的源像素混合。 这可能很有用,例如,如果您只想写入深度/模板缓冲区,而不是后台缓冲区。 为此,请将源像素混合因子设置为D3D12_BLEND_ZERO,将目标混合因子设置为D3D12_BLE...原创 2018-11-05 09:57:01 · 1101 阅读 · 3 评论 -
手把手教你架构3D引擎高级篇系列六
前面给读者介绍了哈希表的封装,其实我们实现的是数据结构的算法,原创 2018-11-23 14:06:11 · 899 阅读 · 0 评论 -
手把手教你架构3D引擎高级篇系列七
前面封装了数据结构中常用算法,接下来给读者封装一个好用的东西——委托。使用过Unity开发的人知道,我们经常在项目中使用委托,类似我们说的回调。使用C#编写委托,其实质是什么呢?其实就是把委托函数加到一个列表中。我们在实现引擎的委托时,首先要清楚我们的委托面对的是所有类型的,因此很容想到模板。在实现委托时,我们分两个模块,一个是委托,一个是委托列表。在这里我们还是用了模板指针,C++模板这块技术,...原创 2018-12-01 16:57:24 · 1675 阅读 · 1 评论 -
手把手教你成为Shader编程实战达人—GPU
GPU编程市场应用GPU全称是Graphics Processing Unit,中文成为图形处理器,所以GPU编程也叫图形学编程,它是针对的显卡中的芯片编程,游戏引擎的更新换代发展的一个重要阶段是显卡芯片的出现,引擎的渲染能力得到极大提升。GPU 加速器于 2007 年由 NVIDIA® 率先推出,引擎的更新换代也是跟GPU硬件息息相关的,从固定流水线变成了可编程流水线,画面品质得到了质的飞跃...原创 2018-12-08 10:53:43 · 3133 阅读 · 0 评论 -
手把手教你架构3D引擎高级篇系列八
本篇博客是给读者介绍引擎底层如何与Lua进行结合,方便开发者直接使用脚本编程,为什么选择Lua,通常开发者会使用Json,XML,txt等等。相比Lua有哪些优点呢?a、除了Lua库,在没有使用其他库可以使用。b、可以在文件中使用不同的公式,例如:some_variable = math.sqrt(2)* 2c、它非常轻巧,速度快d、它是在MIT许可下换句话说代码是开源的,因此我们可以以任...原创 2018-12-03 21:14:45 · 1071 阅读 · 0 评论 -
手把手教你成为Shader编程达人系列概述
最近,很多大型的游戏公司或者虚拟现实公司,都在大量招聘资深的GPU渲染引擎程序员或者引擎主管等。对于从事游戏开发的程序员,尤其是客户端程序员掌握GPU编程非常重要,由于项目分工的缘故,大部分程序员并没有接触到GPU编程,认为GPU编程很高深,在项目开发过程中并不关心,只负责写逻辑,这样会严重阻碍自己的职业发展。作为一名从事IT行业多年的老程序员,要想在行业立足,技术要做到全面,当然自己最拿手的技术...原创 2018-12-07 08:07:47 · 3745 阅读 · 13 评论 -
聊聊引擎底层如何编译Shader脚本
由于现在的引擎都比较完善,开发者无需关心引擎底层的技术,只负责写逻辑即可,比如Unity引擎和UE4引擎,它们的出现确实为开发者提供了便利,但是对开发者来说,个人认为并不是好事情,它导致了大部分开发者只能做些没有任何科技含量的东西,请允许我这么说,因为我们只是在如何用好引擎方面大动脑筋,而不是去思考如何改造引擎。更要命的是使用的引擎都是国外开发的,人家是做底层的技术,换句话说,核心技术掌握在人家手...原创 2018-12-15 16:51:21 · 3148 阅读 · 3 评论 -
聊聊引擎底层如何实现Forward+Phone渲染
现在的渲染技术由于硬件的提升,算法也得到了极大的改进,Forward,Deferred在成熟引擎中已经得到了广泛的应用,比如Unity,UE4等。下面我们将其应用到我们自己的引擎中,先看看Phone算法。Phone算法首先要了解Phone模型算法的作用,它是计算镜面反射光强的模型,它的计算公式是一个叫Phong Bui Tuong提出的,我们的Shader编程也是根据此算法实现的,看下面的公...原创 2018-12-21 13:22:08 · 1197 阅读 · 0 评论 -
Fog Volume渲染算法实现
由于项目需求,需要实现Fog Volume的效果,查阅了网上资料没有找到相关算法介绍,Unity虽然提供了插件但是效果不是项目想要的,只能自己去写,为了便于日后查阅,写篇博客记录下来,在介绍Fog Volume算法实现之前,先介绍Fog Volume可以实现的效果表现,它可以跟blinn phone,阴影结合起来使用,效果更佳,看下面与blinn phone结合实现的效果:每种渲染效果的背后都...原创 2018-12-27 21:42:51 · 3621 阅读 · 2 评论 -
聊聊引擎底层如何实现Deferred延迟渲染
Deferred又称为延迟渲染,它是后处理渲染技术的一种,网上也有相关的定义说明,它主要是采用GBuffer实现的,GBuffer可以存储的信息相比ZBuffer更多,这也是Unity引擎也提供了Deferred渲染,只是在手机端比较耗,所以大部分开发者并不是特别关注,其实它在引擎渲染里面也是非常重要的。程序我们还需要自己手动实现一下,这样对技术的理解能够更深入。我们在上篇博客中给读者介绍了关于...原创 2018-12-17 19:22:48 · 1556 阅读 · 1 评论 -
聊聊引擎底层如何实现BRDF渲染算法
BRDF作为比较流行的渲染算法,但凡成熟的引擎的都有此功能,我们自己写引擎也不例外,我在编写引擎时也会参考网上的一些资料,这也是学习的过程,先介绍BRDF,它是双向反射分布函数,说白了它是对于物体表面上光的处理,BRDF有很多模型,我们在编写Shader的时候也是基于这些模型。BRDF使用的数学模型是Cook-Torrance公式,如下所示:我们实现的BRDF渲染算法会参考Unreal Eng...原创 2018-12-29 08:38:58 · 4349 阅读 · 3 评论 -
聊聊引擎底层如何实现Bloom渲染算法
Bloom渲染是游戏中常用的,在Unity和UE4中也有Bloom渲染算法如果我们自己实现Bloom渲染算法,该如何实现呢?网上关于Bloom的实现算法讲述的也比较多,但是我们本篇实现的Bloom渲染算法相对来说比较简单,但是效果也不赖。我们讲述的同样是引擎底层实现的Bloom渲染算法,我们在实现渲染算法之前都会查阅相关资料,那我们自己编写Bloom渲染算法,参考的网址:https://lear...原创 2019-01-03 15:39:36 · 4944 阅读 · 0 评论 -
聊聊引擎底层如何实现SSAO渲染
SSAO被称为屏幕空间环境光遮蔽,它的原理是:对于铺屏四边形(Screen-filled Quad)上的每一个片段,我们都会根据周边深度值计算一个遮蔽因子(Occlusion Factor)。这个遮蔽因子之后会被用来减少或者抵消片段的环境光照分量。遮蔽因子是通过采集片段周围球型核心(Kernel)的多个深度样本,并和当前片段深度值对比而得到的。高于片段深度值样本的个数就是我们想要的遮蔽因子。SS...原创 2018-12-19 09:01:56 · 1796 阅读 · 0 评论 -
[译]体素技术介绍
A voxel representation of a scene has spatial data as opposed to the conventional rasterization view (as stored in a render target) which just has a slice of depth value. A voxelized scene can be easi...原创 2019-01-01 09:18:04 · 13058 阅读 · 3 评论 -
图形学渲染算法资料持续更新中
Forward vs Deferred vs Forward+ Rendering with DirectX 11https://www.3dgep.com/forward-plus/Fundamentals of Ray Tracinghttp://www.cosinekitty.com/raytrace/contents.htmlThe Basics of GPU Voxelizati...原创 2019-01-11 20:57:53 · 2029 阅读 · 5 评论