原文 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. Unknown command: crawl

    Use "scrapy" to see available commands 1.使用命令行方式cmd,是因为没有cd到项目的根目录,crawl会去搜索cmd目录下的scrapy. ...

  2. PHP搜索优化 sphinx 实战

    环境:win7 64 wamp 解压sphinx安装包后,简历如下结构.注意,conf目录是我的配置文件目录 在conf目录下,简历newdefend.conf文件,配置内容如下 # 配置数据源 so ...

  3. [转]深入理解定位父级offsetParent及偏移大小

    偏移量(offset dimension)是javascript中的一个重要的概念.涉及到偏移量的主要是offsetLeft.offsetTop.offsetHeight.offsetWidth这四个 ...

  4. Linq To SQL和Linq To Object的批量操作InsertAllOnSubmit介绍

    无论是Linq To SQL还是Linq To Object(Entity frameworks)它们都为开发人员提供了Insert操作,及Insert集合操作,即InsertOnSubmit和Ins ...

  5. win7开机启动项设置

    Windows系统自身就有启动项命令可以进行设置: 要说到修改启动项,当然首推Windows系统自带的“MSCONFIG”命令,XP等其他Windows系统用户使用方法是一模一样的. 1.点击“开始” ...

  6. WPF内嵌CEF控件,与JS交互

    1)安装cefsharp.winform包 打开VS2017,打开nuget,找到cefsharp.winform,安装 问:为什么wpf程序不使用cefsharp.wpf? 答:因为cefwpf 4 ...

  7. windows服务器nginx日志分割

    编写一个bat文件 @echo off rem @echo off rem 取1天之前的日期 echo wscript.echo dateadd(,date) >%tmp%\tmp.vbs fo ...

  8. uptime查看服务器运行时间

    uptime命令用于查看服务器运行了多长时间以及有多少个用户登录,快速获知服务器的负荷情况. uptime的输出包含一项内容是load average,显示了最近1,5,15分钟的负荷情况.它的值代表 ...

  9. bzoj2049: [Sdoi2008]Cave 洞穴探测

    bzoj2049: [Sdoi2008]Cave 洞穴探测 给n个点,每次连接两个点或切断一条边,保证是树结构,多次询问两个点是否联通 Lct裸题 //Achen #include<algori ...

  10. 数据库通过sql备份脚本恢复时,报错误The user specified as a definer ('root'@'%') does not exist

    数据库通过sql备份脚本恢复时,报错误The user specified as a definer ('root'@'%') does not exist 当出现这个错误,意思是某个数据库对象的定义 ...