=====Tutorial 1 - Direct3D 11 Basics=====
//by Richard Russell, August 2015//\\ \\ **Note that the code in this tutorial requires Windows 8.1 or Windows 10**\\ \\ This tutorial is closely based on Microsoft's Direct 3D 11 [[https://msdn.microsoft.com/en-us/library/ff729718.aspx|Tutorial 1]] but with the code translated from C++ to //BBC BASIC for Windows//. You should refer to the original for a detailed explanation of the code.\\ \\ {{Tutorial01.png}}\\ \\
===== Summary =====
\\ In this first tutorial, we will go through the elements necessary to create a minimal Direct3D 11 application. Every Direct3D 11 application must have these elements to function properly. The elements include setting up a window and a device object, and then displaying a colour on the window.\\ \\
===== Source =====
\\ The source files, libraries etc. may be downloaded from [[http://www.rtr.myzen.co.uk/D3D11tutorial.zip|here]].\\ \\
===== Setting Up The Direct3D 11 Device =====
\\ The following is the code to create a **device** and a **swap chain**:
DIM sd{} = DXGI_SWAP_CHAIN_DESC{}
sd.BufferCount% = 1
sd.BufferDesc.Width% = Width%
sd.BufferDesc.Height% = Height%
sd.BufferDesc.Format% = DXGI_FORMAT_R8G8B8A8_UNORM
sd.BufferDesc.RefreshRate.Numerator% = 60
sd.BufferDesc.RefreshRate.Denominator% = 1
sd.BufferUsage% = DXGI_USAGE_RENDER_TARGET_OUTPUT
sd.OutputWindow% = @hwnd%
sd.SampleDesc.Count% = 1
sd.SampleDesc.Quality% = 0
sd.Windowed% = 1
SYS `D3D11CreateDeviceAndSwapChain`, NULL, D3D_DRIVER_TYPE_HARDWARE, \
\ NULL, 0, NULL, 0, D3D11_SDK_VERSION, sd{}, ^pSwapChain%, \
\ ^pd3dDevice%, NULL, ^pImmediateContext% TO hr%
IF hr% <> S_OK ERROR 100, "CreateDeviceAndSwapChain failed: "+STR$~hr%
!(^IDXGISwapChain{}+4) = !pSwapChain%
!(^ID3D11Device{}+4) = !pd3dDevice%
!(^ID3D11DeviceContext{}+4) = !pImmediateContext%
The code to create and set the **render target view** is as follows:
REM Create a render target view:
SYS IDXGISwapChain.GetBuffer%, pSwapChain%, 0, IID_ID3D11Texture2D, \
\ ^pBackBuffer% TO hr%
IF hr% <> S_OK ERROR 100, "IDXGISwapChain::GetBuffer failed: "+STR$~hr%
!(^ID3D11Texture2D{}+4) = !pBackBuffer%
SYS ID3D11Device.CreateRenderTargetView%, pd3dDevice%, pBackBuffer%, NULL, \
\ ^pRenderTargetView% TO hr%
IF hr% <> S_OK ERROR 100, "ID3D11Device::CreateRenderTargetView failed: "+STR$~hr%
SYS ID3D11Texture2D.Release%, pBackBuffer%
SYS ID3D11DeviceContext.OMSetRenderTargets%, pImmediateContext%, \
\ 1, ^pRenderTargetView%, NULL
The last thing we need to set up before Direct3D 11 can render is initialize the **viewport**:
DIM vp{} = D3D11_VIEWPORT{} : REM All members are floats
vp.Width% = FN_f4(Width%)
vp.Height% = FN_f4(Height%)
vp.MinDepth% = 0
vp.MaxDepth% = FN_f4(1.0)
vp.TopLeftX% = 0
vp.TopLeftY% = 0
SYS ID3D11DeviceContext.RSSetViewports%, pImmediateContext%, 1, vp{}
===== The Rendering Code =====
\\ In this tutorial, we will render the simplest scene possible, which is to fill the screen with a single colour:
REM Clear the back buffer:
DIM ClearColor%(3)
ClearColor%() = 0, FN_f4(0.125), FN_f4(0.6), FN_f4(1.0) : REM RGBA
SYS ID3D11DeviceContext.ClearRenderTargetView%, pImmediateContext%, \
\ pRenderTargetView%, ^ClearColor%(0)
REM Present the information rendered to the back buffer:
SYS IDXGISwapChain.Present%, pSwapChain%, 0, 0