原文 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. JS 生成二维码和加上logo图片

    参考链接:https://www.cnblogs.com/chiyi/p/5710324.html,http://www.jq22.com/jquery-info294 demo链接:demo查看 d ...

  2. JavaScript模板引擎实例应用(转)

    本文将举实例向大家讲解几个常用模板引擎的简单使用. 演示地址:模板引擎示例http://demo.52fhy.com/jstemp/ 准备工作 演示数据:blog.json结构: { "li ...

  3. 数组的方法之(Array.prototype.reduce() 方法)

    reduce函数 reduce() 方法对累加器和数组中的每个元素(从左到右)应用一个函数,将其减少为单个值. 对数组中的所有元素调用指定的回调函数.该回调函数的返回值为累积结果,并且此返回值在下一次 ...

  4. 20190902+0903合集-NOIP模拟

    一直没时间写QwQ 于是补一下. Day 1 晚饭吃的有点恶心…… $1s\,2s\,5s$ 还开 -O2 ?? 有点恐怖. T1 猛的一想: 把外面设成一个点, 向入口连一条权为排队时间的边 从出口 ...

  5. ActiveMQ消息中间件

    最近学习到ActiveMQ,之前也没有用过相关或者类似的工具,因此特地写个文章进行相关的学习记录. 相关参考博文:https://www.cnblogs.com/cyfonly/p/6380860.h ...

  6. jedis与spring整合及简单的使用RedisTemplate操作

    整理一下redis与spring的整合.以及使用redisTemplate.首先是要导入spring所需要的jar.当然还有 jedis-2.1.0.jar,commons-pool-1.5.4.ja ...

  7. 2018-2-13-wpf-PreviewTextInput-在鼠标输入获得-_u0003

    title author date CreateTime categories wpf PreviewTextInput 在鼠标输入获得 � lindexi 2018-2-13 17:23:3 +08 ...

  8. xinetd服务管理

    xinetd服务的管理文件都放在 /etc/xinetd.d目录内,我们可以编辑这个目录内的服务文件来开启和关闭服务.每个服务文件都有disable 这个行,如果把值改成yes就是禁用服务,如果是no ...

  9. Oracle存储1.1

    1.生成一个表的简单sql语句 CREATE OR REPLACE PROCEDURE proc_AutoGenerateSQL(  tableName   VARCHAR2 ,--参数 需要操作的表 ...

  10. 火狐下button标签子元素无法点击

    button下元素点击事件:在chrome和safari下每个a标签可以点击,在火狐下a标签无法点击. <button> <a href="javascript:;&quo ...