1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| #include <windows.h> #include <d3d11.h> #include <d3dcompiler.h> #include <iostream> #include <wrl/client.h>
#pragma comment(lib, "d3d11.lib") #pragma comment(lib, "dxgi.lib") #pragma comment(lib, "d3dcompiler.lib")
using Microsoft::WRL::ComPtr;
struct Vertex { float x, y, z; float r, g, b, a; };
const char* shaderSource = R"( struct VOut { float4 pos : SV_POSITION; float4 col : COLOR; }; VOut VShader(float4 pos : POSITION, float4 col : COLOR) { VOut output; output.pos = pos; output.col = col; return output; } float4 PShader(float4 pos : SV_POSITION, float4 col : COLOR) : SV_TARGET { return col; } )";
int main() { system("chcp 65001"); HWND hWnd = GetConsoleWindow(); if (!hWnd) { std::cout << "无法获取控制台句柄!" << std::endl; return -1; }
DXGI_SWAP_CHAIN_DESC sd = {}; sd.BufferCount = 1; sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; sd.OutputWindow = hWnd; sd.SampleDesc.Count = 1; sd.Windowed = TRUE;
ComPtr<ID3D11Device> device; ComPtr<ID3D11DeviceContext> context; ComPtr<IDXGISwapChain> swapChain; D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, nullptr, 0, D3D11_SDK_VERSION, &sd, &swapChain, &device, nullptr, &context);
ComPtr<ID3D11RenderTargetView> rtv; ComPtr<ID3D11Texture2D> backBuffer; swapChain->GetBuffer(0, IID_PPV_ARGS(&backBuffer)); device->CreateRenderTargetView(backBuffer.Get(), nullptr, &rtv);
ComPtr<ID3D11VertexShader> vs; ComPtr<ID3D11PixelShader> ps; ComPtr<ID3DBlob> vsBlob, psBlob; D3DCompile(shaderSource, strlen(shaderSource), nullptr, nullptr, nullptr, "VShader", "vs_4_0", 0, 0, &vsBlob, nullptr); D3DCompile(shaderSource, strlen(shaderSource), nullptr, nullptr, nullptr, "PShader", "ps_4_0", 0, 0, &psBlob, nullptr); device->CreateVertexShader(vsBlob->GetBufferPointer(), vsBlob->GetBufferSize(), nullptr, &vs); device->CreatePixelShader(psBlob->GetBufferPointer(), psBlob->GetBufferSize(), nullptr, &ps);
ComPtr<ID3D11InputLayout> layout; D3D11_INPUT_ELEMENT_DESC ied[] = { {"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} }; device->CreateInputLayout(ied, 2, vsBlob->GetBufferPointer(), vsBlob->GetBufferSize(), &layout);
Vertex vertices[] = { { 0.0f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f }, { 0.45f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, {-0.45f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f } }; ComPtr<ID3D11Buffer> vb; D3D11_BUFFER_DESC bd = { sizeof(vertices), D3D11_USAGE_DEFAULT, D3D11_BIND_VERTEX_BUFFER, 0, 0, 0 }; D3D11_SUBRESOURCE_DATA srd = { vertices, 0, 0 }; device->CreateBuffer(&bd, &srd, &vb);
RECT rc; GetClientRect(hWnd, &rc); D3D11_VIEWPORT vp = { 0, 0, (float)(rc.right - rc.left), (float)(rc.bottom - rc.top), 0.0f, 1.0f }; context->RSSetViewports(1, &vp);
std::cout << "正在控制台渲染彩色三角形... 按下 ESC 键退出。" << std::endl;
while (!(GetAsyncKeyState(VK_ESCAPE) & 0x8000)) { float bgColor[] = { 0.1f, 0.1f, 0.1f, 1.0f }; context->ClearRenderTargetView(rtv.Get(), bgColor);
context->OMSetRenderTargets(1, rtv.GetAddressOf(), nullptr); context->IASetInputLayout(layout.Get()); context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); UINT stride = sizeof(Vertex), offset = 0; context->IASetVertexBuffers(0, 1, vb.GetAddressOf(), &stride, &offset); context->VSSetShader(vs.Get(), nullptr, 0); context->PSSetShader(ps.Get(), nullptr, 0);
context->Draw(3, 0); swapChain->Present(1, 0); }
return 0; }
|