原文 http://www.johanfalk.eu/blog/sharpdx-beginners-tutorial-part-3-initializing-directx

在这部分中,我们将初始化DirectX。

我们要做的第一步是添加一个调用InitializeDeviceResources()我们Game 类的新方法,如下所示:

private void InitializeDeviceResources()
{
}

首先,我们需要为后台缓冲区创建一个描述,这是通过以下代码完成的:

using SharpDX.DXGI;
[...]
ModeDescription backBufferDesc = new ModeDescription(Width, Height, new Rational(60, 1), Format.R8G8B8A8_UNorm);
  • 前两个参数是后缓冲区的大小,在大多数情况下,它应该与我们渲染的窗口的客户端宽度/高度相匹配。

  • 第三个参数是以Hz(赫兹)为单位的刷新率,我们将其设置为60/1 = 60 Hz。

  • 最后一个参数是后台缓冲区的格式,这里我们使用32位无符号整数指定一个带有红色,绿色,蓝色和alpha通道的格式。

有关完整列表,请参阅MSDN文档DXGI_MODE_DESC

下一步是使用以下代码为我们的交换链创建描述符:

SwapChainDescription swapChainDesc = new SwapChainDescription()
{
ModeDescription = backBufferDesc,
SampleDescription = new SampleDescription(1, 0),
Usage = Usage.RenderTargetOutput,
BufferCount = 1,
OutputHandle = renderForm.Handle,
IsWindowed = true
};
  • ModeDescription:这里我们提供后台缓冲区描述。

  • SampleDescription:这是一个多重采样的描述符,我们只指定一个级别(无多重采样)请参阅MSDN上的DXGI_SAMPLE_DESC

  • 用法:指定CPU是否/如何访问后台缓冲区,因为我们正在渲染它,我们将其指定为RenderTargetOutput。有关其他选项,请参阅MSDN for DXGI_USAGE

  • OutputHandle:处理窗口以进行渲染。

  • BufferCount:缓冲区数,我们只需要1。

  • IsWindowed:我们希望处于全屏或窗口模式。

这些都是我们现在需要设置的,对于其他选项,请参阅MSDN上的DXGI_SWAP_CHAIN_DESC

现在我们已经创建了描述,现在是时候创建实际的设备和交换链了。首先,我们在Game 类中声明三个私有类变量:

using D3D11 = SharpDX.Direct3D11;
[...]
private D3D11.Device d3dDevice;
private D3D11.DeviceContext d3dDeviceContext;
private SwapChain swapChain;

我们还补充道using D3D11 = SharpDX.Direct3D11;。我们使用这种表示法来避免类之间的名称冲突,并避免编写全名,例如SharpDX.Direct3D11.Device

是时候真正创建我们的设备和交换链了:

using SharpDX.Direct3D;
[...]
D3D11.Device.CreateWithSwapChain(DriverType.Hardware, D3D11.DeviceCreationFlags.None, swapChainDesc, out d3dDevice, out swapChain);
d3dDeviceContext = d3dDevice.ImmediateContext;
  • 第一个参数指定我们要使用GPU。

  • 我们选择不使用任何特殊标志,因为可能的标志在MSDN上看到D3D11_CREATE_DEVICE_FLAG

  • 第三个参数是我们的交换链描述符。

  • 最后一个参数是我们想要存储交换链和设备的变量。

我们还从设备获取设备上下文。

接下来,我们将创建一个可以渲染的后台缓冲区。首先添加另一个私有类变量来保存渲染目标视图:

private D3D11.RenderTargetView renderTargetView;

我们得到的可以通过指定我们想要的后缓冲区类型从交换链中得到这个,在我们的例子中是a Texture2D。然后我们从它创建一个渲染目标视图,我们很快就会使用它。

using (D3D11.Texture2D backBuffer = swapChain.GetBackBuffer<D3D11.Texture2D>(0))
{
renderTargetView = new D3D11.RenderTargetView(d3d11Device, backBuffer);
}

所以,现在我们终于可以渲染一些东西了,为什么不使用我们所有的图形功能并绘制蓝屏!让我们在Game类中添加一个名为Draw()的新方法,并添加以下代码:

private void Draw()
{
d3d11DeviceContext.OutputMerger.SetRenderTargets(renderTargetView);
d3dDeviceContext.ClearRenderTargetView(renderTargetView, new SharpDX.Color(32, 103, 178));
swapChain.Present(1, PresentFlags.None);
}

此代码首先将活动渲染目标视图设置为我们刚刚创建的渲染目标视图。然后它清除渲染目标视图(当前是我们的后台缓冲区),然后用前缓冲区交换后面,使后台缓冲区可见。通过指定1作为Present(…) 我们在呈现之前等待监视器的垂直同步的第一个参数。这会将FPS限制为监视器的更新频率。

现在我们差不多完成了,我们需要InitializeDeviceResources() 先从我们的Game类构造函数调用:

public Game()
{
[...] InitializeDeviceResources();
}

然后我们还需要调用Draw()我们的RenderCallback()方法:

private void RenderCallback()
{
Draw();
}

最后,我们将为我们的Dispose()方法添加一些清理:

public void Dispose()
{
renderTargetView.Dispose();
swapChain.Dispose();
d3dDevice.Dispose();
d3dDeviceContext.Dispose();
renderForm.Dispose();
}

如果你运行它,你现在应该有一个漂亮的蓝色窗口,如下所示:

在下一个教程中,我们将看看渲染我们的第一个(很多)三角形。完整的源代码可以在我的GitHub repo上找到:https//github.com/mrjfalk/SharpDXTutorials

SharpDX初学者教程第3部分:初始化DirectX的更多相关文章

  1. SharpDX初学者教程第4部分:绘制三角形

    原文 http://www.johanfalk.eu/blog/sharpdx-beginners-tutorial-part-4-drawing-a-triangle 现在我们有了一个Direct3 ...

  2. SharpDX初学者教程第2部分:创建窗口

    原文 http://www.johanfalk.eu/blog/sharpdx-tutorial-part-2-creating-a-window 在第二篇教程中,我们将介绍如何创建一个稍后将呈现的简 ...

  3. SharpDX初学者教程第1部分:在Visual Studio 2013中设置SharpDX项目

    原文 http://www.johanfalk.eu/blog/sharpdx-tutorial-part-1-setting-up-a-sharpdx-project-in-visual-studi ...

  4. SharpDX初学者教程第5部分:着色三角形

    原文 http://www.johanfalk.eu/blog/sharpdx-beginners-tutorial-part-5-coloring-the-triangle 在第4部分中,我们创建了 ...

  5. 魔兽争霸Ⅲ运行时不能初始化directX的错误解决

    运行魔兽争霸3不能初始化DirectX错误这样解决: 1:在运行中输入(win+r):dxdiag,查看显示栏,确定电脑已安装好directx 8.1以上,且下面的三个加速都已开启. 2:如果没有安装 ...

  6. DirectX 初始化DirectX(第一方式)

      上一章我们学会了如何C++Win32项目中搭建DirectX开发环境, 那么下面来写代码初始化DirectX吧O(∩_∩)O~. 首先你创建一个Win32程序,点击运行你可以看见一个window窗 ...

  7. Go GraphQL初学者教程

    Go GraphQL初学者教程 https://tutorialedge.net/golang/go-graphql-beginners-tutorial/ https://tutorialedge. ...

  8. 《SLAM for Dummies》中文版《SLAM初学者教程》

    SLAM for Dummies  SLAM初学者教程A Tutorial Approach to Simultaneous Localization and Mapping  一本关于实时定位及绘图 ...

  9. SLAM for Dummies SLAM初学者教程 中文翻译 1到4章

    SLAM for Dummies  SLAM初学者教程A Tutorial Approach to Simultaneous Localization and Mapping  一本关于实时定位及绘图 ...

随机推荐

  1. c++新特性实验(3)声明与定义:constexpr

    1.作用 constexpr 声明一个函数或变量,它的值可以在编译时出现在常量表达式之中. 2.constexpr 变量要求 其类型必须是 字面类型 (LiteralType) . 它必须被立即初始化 ...

  2. 做移动应用使用地图API时需要注意的问题

    最近在做一个基于地点提醒的移动应用,当初考虑大家都心知肚明的原因,谨慎的选择了百度地图,现在想想其实完全没有必要,好的应用本来就不分国界的,最后可能还是得换回Google地图.毕竟Google地图在技 ...

  3. No module named zope.interface error 的解决

    在 import zope.interface 时,出现错误 No module named zope.interface error根据 http://stackoverflow.com/quest ...

  4. 数据库迁移工具DBMigration

  5. GIT → 00:GIT学习大纲

    1. 学习版本控制的原因 1.1 没有版本控制出现的问题 1.2 版本控制的简介 1.3 版本控制工具 2. Git 和 Svn 比较 2.1 SVN介绍 2.1.1 SVN简介 2.1.2 SVN基 ...

  6. hive如何配置支持事务及insert、update、delete

    Hive从0.14版本开始支持事务和行级更新,但缺省是不支持的,需要一些附加的配置.要想支持行级insert.update.delete,需要配置Hive支持事务. 一.Hive具有ACID语义事务的 ...

  7. chmod 777 修改权限之后,文件夹颜色变绿:解决方案

    修改前: 方法一: ls --color=none #不显示颜色 方法一修改后: 方法二:修改配色 ①安装git +++可用在windows下载之后用ftp传上去:http://pan.baidu.c ...

  8. Yii 学习笔记

    Yii常用执行SQL方法 ====================================================== ================================ ...

  9. 【笔记】http协议笔记

    本文是本人在复习http协议时,手动整理的资料,以备后续查阅. http(hypertext transfer protocol):超文本协议.是万维网(world wide web,www,也简称为 ...

  10. Latex 出现编辑公式,出现错误 !pdfTex error: Font rntxmi7 at 438 not found

    http://docs.miktex.org/manual/advanced.html http://www.cl-projects.de/projects/misc/miktex-fonts.pht ...