如何使用DX11绘制一个长方体
要使用DX11绘制一个长方体,你需要按照以下步骤进行操作:
-
创建一个DX11设备和设备上下文:
ID3D11Device* device; ID3D11DeviceContext* context; D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, nullptr, 0, D3D11_SDK_VERSION, &device, nullptr, &context); -
创建一个顶点缓冲区:
struct Vertex { DirectX::XMFLOAT3 position; DirectX::XMFLOAT4 color; }; Vertex vertices[] = { { DirectX::XMFLOAT3(-0.5f, -0.5f, -0.5f), DirectX::XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f) }, { DirectX::XMFLOAT3(-0.5f, 0.5f, -0.5f), DirectX::XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f) }, { DirectX::XMFLOAT3(0.5f, 0.5f, -0.5f), DirectX::XMFLOAT4(0.0f, 0.0f, 1.0f, 1.0f) }, { DirectX::XMFLOAT3(0.5f, -0.5f, -0.5f), DirectX::XMFLOAT4(1.0f, 1.0f, 0.0f, 1.0f) }, { DirectX::XMFLOAT3(-0.5f, -0.5f, 0.5f), DirectX::XMFLOAT4(0.0f, 1.0f, 1.0f, 1.0f) }, { DirectX::XMFLOAT3(-0.5f, 0.5f, 0.5f), DirectX::XMFLOAT4(1.0f, 0.0f, 1.0f, 1.0f) }, { DirectX::XMFLOAT3(0.5f, 0.5f, 0.5f), DirectX::XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f) }, { DirectX::XMFLOAT3(0.5f, -0.5f, 0.5f), DirectX::XMFLOAT4(0.5f, 0.5f, 0.5f, 1.0f) } }; D3D11_BUFFER_DESC vertexBufferDesc; ZeroMemory(&vertexBufferDesc, sizeof(vertexBufferDesc)); vertexBufferDesc.Usage = D3D11_USAGE_DEFAULT; vertexBufferDesc.ByteWidth = sizeof(Vertex) * 8; vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; vertexBufferDesc.CPUAccessFlags = 0; D3D11_SUBRESOURCE_DATA vertexBufferData; ZeroMemory(&vertexBufferData, sizeof(vertexBufferData)); vertexBufferData.pSysMem = vertices; ID3D11Buffer* vertexBuffer; device->CreateBuffer(&vertexBufferDesc, &vertexBufferData, &vertexBuffer); -
创建一个索引缓冲区:
DWORD indices[] = { 0, 1, 2, 0, 2, 3, 4, 6, 5, 4, 7, 6, 4, 5, 1, 4, 1, 0, 3, 2, 6, 3, 6, 7, 1, 5, 6, 1, 6, 2, 4, 0, 3, 4, 3, 7 }; D3D11_BUFFER_DESC indexBufferDesc; ZeroMemory(&indexBufferDesc, sizeof(indexBufferDesc)); indexBufferDesc.Usage = D3D11_USAGE_DEFAULT; indexBufferDesc.ByteWidth = sizeof(DWORD) * 36; indexBufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER; indexBufferDesc.CPUAccessFlags = 0; D3D11_SUBRESOURCE_DATA indexBufferData; ZeroMemory(&indexBufferData, sizeof(indexBufferData)); indexBufferData.pSysMem = indices; ID3D11Buffer* indexBuffer; device->CreateBuffer(&indexBufferDesc, &indexBufferData, &indexBuffer); -
创建一个顶点着色器和像素着色器:
ID3DBlob* vertexShaderBlob; D3DReadFileToBlob(L"VertexShader.cso", &vertexShaderBlob); device->CreateVertexShader(vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), nullptr, &vertexShader); ID3DBlob* pixelShaderBlob; D3DReadFileToBlob(L"PixelShader.cso", &pixelShaderBlob); device->CreatePixelShader(pixelShaderBlob->GetBufferPointer(), pixelShaderBlob->GetBufferSize(), nullptr, &pixelShader); -
创建输入布局:
D3D11_INPUT_ELEMENT_DESC layoutDesc[] = { { "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 } }; ID3D11InputLayout* inputLayout; device->CreateInputLayout(layoutDesc, 2, vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), &inputLayout); -
设置渲染状态:
context->IASetInputLayout(inputLayout); context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); context->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset); context->IASetIndexBuffer(indexBuffer, DXGI_FORMAT_R32_UINT, 0); context->VSSetShader(vertexShader, nullptr, 0); context->PSSetShader(pixelShader, nullptr, 0); -
渲染场景:
context->DrawIndexed(36, 0, 0); -
清理资源:
vertexBuffer->Release(); indexBuffer->Release(); vertexShader->Release(); pixelShader->Release(); inputLayout->Release(); ``
原文地址: https://www.cveoy.top/t/topic/hThS 著作权归作者所有。请勿转载和采集!