directx game programming ( one ): create a direct3d pr...

DirectX是一个由微软开发的多媒体编程接口,用于Windows平台上的游戏和应用程序开发。最新的版本是DirectX 12,它提供了基于硬件的图形加速、音频加速、输入设备控制、网络通信和多媒体处理等功能。本文将介绍Direct3D编程的基础,包括创建Direct3D设备、创建顶点缓冲区、设置顶点格式和渲染图形等。

步骤一:创建Direct3D设备

在使用Direct3D之前,需要创建一个Direct3D设备对象。创建设备需要用到D3D11CreateDevice函数,示例代码如下:

```C++

HRESULT hr = S_OK;

ID3D11Device* g_pd3dDevice = nullptr;

D3D_FEATURE_LEVEL featureLevels[] =

{

D3D_FEATURE_LEVEL_11_0

};

hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, D3D11_CREATE_DEVICE_DEBUG, featureLevels, ARRAYSIZE(featureLevels), D3D11_SDK_VERSION, &g_pd3dDevice, nullptr, nullptr);

if (FAILED(hr))

return hr;

```

通过以上代码,我们创建了一个支持硬件加速的Direct3D设备。

步骤二:创建顶点缓冲区

在Direct3D中,渲染的图形需要使用顶点缓冲区来存储顶点信息。创建顶点缓冲区需要设置顶点格式和顶点数据,示例代码如下:

```C++

struct SimpleVertex

{

DirectX::XMFLOAT3 Pos;

DirectX::XMFLOAT4 Color;

};

SimpleVertex vertices[] =

{

{ DirectX::XMFLOAT3(-1.0f, -1.0f, 0.0f), DirectX::XMFLOAT4( 1.0f, 0.0f, 0.0f, 1.0f ) },

{ DirectX::XMFLOAT3(-1.0f, 1.0f, 0.0f), DirectX::XMFLOAT4( 0.0f, 1.0f, 0.0f, 1.0f ) },

{ DirectX::XMFLOAT3( 1.0f, 1.0f, 0.0f), DirectX::XMFLOAT4( 0.0f, 0.0f, 1.0f, 1.0f ) },

{ DirectX::XMFLOAT3( 1.0f, -1.0f, 0.0f), DirectX::XMFLOAT4( 1.0f, 1.0f, 1.0f, 1.0f ) }

};

D3D11_BUFFER_DESC bd;

ZeroMemory(&bd, sizeof(bd));

bd.Usage = D3D11_USAGE_DEFAULT;

bd.ByteWidth = sizeof(SimpleVertex) * 4;

bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;

bd.CPUAccessFlags = 0;

D3D11_SUBRESOURCE_DATA InitData;

ZeroMemory(&InitData, sizeof(InitData));

InitData.pSysMem = vertices;

hr = g_pd3dDevice->CreateBuffer(&bd, &InitData, &g_pVertexBuffer);

if (FAILED(hr))

return hr;

```

以上代码创建了一个包含4个顶点信息的顶点缓冲区,并存储到g_pVertexBuffer对象中。

步骤三:设置顶点格式

在渲染图形时,我们需要设置每个顶点的数据格式。这个数据格式被称为“顶点格式”,它告诉Direct3D每个顶点在缓冲区中占据多少字节以及每个字节的意义。以下是设置顶点格式的示例代码:

```C++

UINT stride = sizeof(SimpleVertex);

UINT offset = 0;

g_pImmediateContext->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset);

g_pImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

D3D11_INPUT_ELEMENT_DESC layout[] =

{

{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },

{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }

};

UINT numElements = ARRAYSIZE(layout);

hr = g_pd3dDevice->CreateInputLayout(layout, numElements, g_VS, sizeof(g_VS), &g_pVertexLayout);

if (FAILED(hr))

return hr;

g_pImmediateContext->IASetInputLayout(g_pVertexLayout);

```

以上代码设置了我们的顶点缓冲区的格式。具体地,我们告诉Direct3D每个顶点是由一个POSITION和一个COLOR组成的,POSITION是一个由三个32位浮点数组成的向量,COLOR是一个由四个32位浮点数组成的向量。此外,我们还告诉Direct3D采用三角形列表的方式渲染顶点。

步骤四:渲染图形

我们已经成功创建了Direct3D设备、顶点缓冲区和顶点格式。现在可以开始渲染图形了。以下是简单的渲染图形的代码:

```C++

float clearColor[4] = { 0.0f, 0.0f, 0.0f, 1.0f };

g_pImmediateContext->ClearRenderTargetView(g_pRenderTargetView, clearColor);

g_pImmediateContext->VSSetShader(g_pVertexShader, nullptr, 0);

g_pImmediateContext->PSSetShader(g_pPixelShader, nullptr, 0);

g_pImmediateContext->Draw(4, 0);

g_pSwapChain->Present(0, 0);

```

以上代码执行以下操作:

1. 清空渲染目标视图的颜色缓冲区为黑色。

2. 设置顶点着色器和像素着色器。

3. 调用绘制函数Draw,渲染出图形。

4. 显示渲染出的图形。

最后,以上是非常简单的Direct3D编程介绍,但仍然是非常基础的一个只能绘制一张色块的程序。在实际开发中,将会需要利用DirectX合理的开发流程和API的良好应用才能实现更加完整的游戏内容。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(77) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部