原文 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. 洛谷P3300 城市规划

    题意:给你一个6 * n的网格题,单点修改,询问区间联通块数.n <= 10w 解:看起来就很显然的一道题......线段树每个点用一个ufs维护连通性.完了. 我为了方便思考把图转成横着的了. ...

  2. 配置android studio环境

    配置java jdk 1.1运行exe 程序 1.2配置jdk 环境变量 添加环境变量 ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin .;%JAVA_HOME%\lib;% ...

  3. beanstalkd 消息队列发邮件

    放入消息 /** * 获取beanstalk实例 * * @staticvar resource|bool $beanstalk * @return resource */ function get_ ...

  4. IO流6 --- FileReader中使用read(char[] cbuf)读入数据 --- 技术搬运工(尚硅谷)

    FileReader 字符输入流 @Test public void test2(){ File file = new File("hello.txt"); FileReader ...

  5. 007-使用python统计代码行数,空行以及注释

    # 自己写过的程序,统计一下你写过多少行代码.包括空行和注释,但是要分别列出来 1.打开文件方法 1.1 以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符 f ...

  6. java如何访问memcache

    1       Memcache是什么 Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的 ...

  7. 访问Bing地图

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 使用C3P0和DBUtils

    1.导包 2.配置c3p0-config.xml <?xml version="1.0" encoding="UTF-8"?> <c3p0-c ...

  9. pytest fixture中scope试验,包含function、module、class、session、package

    上图是试验的目录结构 conftest.py:存放pytest fixture的文件 import uuid import pytest @pytest.fixture(scope="mod ...

  10. date、cal和clear命令

    一.date命令 date命令的功能:date命令是显示或设置系统时间与日期. 很多shell脚本里面需要打印不同格式的时间或日期,以及要根据时间和日期执行操作.延时通常用于脚本执行过程中提供一段等待 ...