原文 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. 『Power AI by AI』 PAI-AutoML2.0重磅发布

    PAI-AutoML调参服务是通过算法的方式解放用户调节算法参数的工作.自2018年8月发布PAI-AutoML1.0版本以来,该功能已经帮助众多PAI的中小企业用户提升了模型的准确性,得到了不错的反 ...

  2. 一探前端开发中的JS调试技巧(转)

    有请提示:文中涉及较多Gif演示动画,移动端请尽量在Wifi环境中阅读 前言:调试技巧,在任何一项技术研发中都可谓是必不可少的技能.掌握各种调试技巧,必定能在工作中起到事半功倍的效果.譬如,快速定位问 ...

  3. hdu oj 1520 Anniversary party(树形dp入门)

    Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  4. 关于JavaScript的一些不得不知道的事儿

    1.JavaScript不区分整数和浮点数,统一用Number表示. 2.NaN这个特殊的Number与所有其他值都不相等,包括它自己: NaN===NaN; //false 唯一能判断NaN的方法是 ...

  5. Bootstrap启动(关闭)轮播

    $('.carousel').carousel(); //启动轮播 $('.carousel').carousel(‘pause’); //关闭轮播 $(‘.carousel’).carousel({ ...

  6. git图形化

    在windows下安装git中文版客户端并连接gitlab 转载自:https://blog.whsir.com/post-1801.html 下载git Windows客户端 git客户端下载地址: ...

  7. solr高亮及摘要

    修改了原文的一点内容:原文地址为:http://www.cnblogs.com/rainbowzc/p/3680343.html 高亮显示 两种方法: 1.在程序里通过设置query返回高亮信息 pu ...

  8. Flask中的session机制

    cookie和sessioncookie:网站中,http请求是无状态的,第一次和服务器连接后并且登陆成功后,第二次请求服务器依然不能知道当前请求是哪个用户.cookie的出现就是解决了改问题,第一次 ...

  9. 运行Jmeter时,响应数据中文乱码问题解决办法

    需要修改jmeter中的配置,在Jmeter安装目录/bin/jmeter.properties文件中进行修改: sampleresult.default.encoding默认为ISO-8859-1, ...

  10. 组合数取模(lucas定理+CRT合并)(AC)

    #include<bits/stdc++.h> #define re register #define int long long using namespace std; ; inlin ...