DX11 怎么繪制空心矩形,也就是矩形線框
在 DX11 中,你可以使用邊界著色器和輸出緩沖區(qū)(Output Merger)來繪制空心矩形,也就是矩形線框。
首先,你需要創(chuàng)建一個邊界著色器,并使用頂點著色器將頂點坐標轉換成裁剪空間坐標(Clip Space Coordinates)。然后,你可以使用邊界著色器的輸出緩沖區(qū)(Output Merger)來繪制空心矩形。
具體來說,你可以在邊界著色器中使用內插(Interpolation)來繪制空心矩形。內插是一種技術,可以在頂點著色器和像素著色器之間插入一個過渡步驟,在這個步驟中,可以使用多種插值方法來控制像素著色器的輸出。我提供了一份 C++ 代碼,展示了如何使用邊界著色器和輸出緩沖區(qū)來繪制空心矩形:
/
包含 DirectX
11
頭文件
#include <d3d11.h>
創(chuàng)建邊界著色器
ID3D11HullShader
*
pHullShader;
創(chuàng)建頂點著色器
ID3D11VertexShader
pVertexShader;
創(chuàng)建輸出緩沖區(qū)
ID3D11Buffer
pOutputBuffer;
初始化邊界著色器
void InitHullShader()
{
加載邊界著色器代碼
const char
hullShaderCode
=
"void main(input patch<float4, 4> i, output patch<float4, 4> o) {"
" o[0] = i[0];"
" o[1] = i[1];"
" o[2] = i[2];"
" o[3] = i[3];"
"}"
;
D3DCompile(hullShaderCode, strlen(hullShaderCode), nullptr, nullptr, nullptr,
"main"
,
"hs_5_0"
0
, &pHullShader, nullptr);
}
初始化頂點著色器
void InitVertexShader()
加載頂點著色器代碼
vertexShaderCode
"void main(float4 inPos : POSITION, out float4 outPos : SV_Position) {"
" outPos = inPos;"
D3DCompile(vertexShaderCode, strlen(vertexShaderCode), nullptr, nullptr, nullptr,
"vs_5_0"
, &pVertexShader, nullptr);
初始化輸出緩沖區(qū)
void InitOutputBuffer()
D3D11_BUFFER_DESC bufferDesc;
bufferDesc.ByteWidth
sizeof(
float
)
4
bufferDesc.Usage
D3D11_USAGE_DEFAULT;
bufferDesc.BindFlags
D3D11_BIND_STREAM_OUTPUT;
bufferDesc.CPUAccessFlags
bufferDesc.MiscFlags
bufferDesc.StructureByteStride
pDevice
-
>CreateBuffer(&bufferDesc, nullptr, &pOutputBuffer);
繪制空心矩形
void DrawHollowRectangle()
設置邊界著色器和頂點著色器
pContext
>HSSetShader(pHullShader, nullptr,
);
>VSSetShader(pVertexShader, nullptr,