D3D11无双(1):渲染你的第一个三角形

D3D11无双(1):渲染你的第一个三角形

blog: http://blog.csdn.net/booirror


话说游戏《古墓丽影II:西安匕首》中,劳拉·克劳福特(Lara Croft)的乳房岂止是性感丰满,简直是硕大无比,有传闻,是因为设计师当时用的鼠标不好使,结果把乳房弄大了。哈哈。


回到话题,初学DirectX11,如何渲染出你的第一个三角形呢。我们将分成几步,介绍DirectX11的基本步骤。


三角形元素

。三角形作为计算机图形的基本图元之一,他有三个顶点,三点确定唯一的三角形。如何表达顶点呢,一个顶点包含三维坐标,还可以包含颜色等属性,我们暂且只包含位置属性。定义如下:

struct Vertex{
XMFLOAT3 Pos;
};


输入布局(Input Layout)

当我们把顶点数据喂给GPU时,那只是一段内存数据,我们必须告诉它数据的布局,GPU才能正确的提取顶点的属性。D3D11_INPUT_ELEMENT_DESC描述了相关的布局。现在我们可以定义D3D11_INPUT_ELEMENT_DESC数组和创建Input Layout:

D3D11_INPUT_ELEMENT_DESC layout[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
UINT numElements = ARRAYSIZE(layout);
hr = md3dDevice->CreateInputLayout(layout, numElements, pVSBlob->GetBufferPointer(),
pVSBlob->GetBufferSize(), &pVertexLayout);
pVSBlob->Release();
md3dImmediateContext->IASetInputLayout(pVertexLayout);


顶点缓冲(Vertex Buffer)

创建顶点缓冲,用来储放顶点数据,如下:

D3D11_BUFFER_DESC bd;
 ZeroMemory(&bd, sizeof(bd));
 bd.Usage = D3D11_USAGE_DEFAULT;
 bd.ByteWidth = sizeof(Vertex) * 3;
 bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
 bd.CPUAccessFlags = 0;


 D3D11_SUBRESOURCE_DATA initData;
 ZeroMemory(&initData, sizeof(initData));
 initData.pSysMem = vertices;
 ID3D11Buffer *pVertexBuffer = nullptr;
 hr = md3dDevice->CreateBuffer(&bd, &initData, &pVertexBuffer);
 if (FAILED(hr)) {
return hr;
 }
 UINT stride = sizeof(Vertex);
 UINT offset = 0;
 md3dImmediateContext->IASetVertexBuffers(0, 1, &pVertexBuffer, &stride, &offset);


渲染三角形

ID3D11DeviceContext::Draw()将使用当前的缓冲数据,布局信息进行渲染,第一个参数表示顶点个数,和第一个顶点的索引位置。这里分别是对应的值是3, 0,所以:

// Render a triangle
g_pImmediateContext->VSSetShader( g_pVertexShader, NULL, 0 );
g_pImmediateContext->PSSetShader( g_pPixelShader, NULL, 0 );
g_pImmediateContext->Draw( 3, 0 );

最后看看效果咯:

D3D11无双(1):渲染你的第一个三角形_第1张图片

吐槽下博客编辑器:直接把图片粘贴在编辑器,编辑器里能正常显示,发布后就没有了。。之前还遇到其他编辑问题,相信用过的人都或多或少碰到过问题。还有就是现在的水印不显示博客名了,以后一律不打水印了,反正有水印也认不出是我的图。

你可能感兴趣的:(游戏,3D,三角形,DirectX,directx11)