首頁
社區(qū)
課程
招聘
DX11 繪制空心矩形

DX11 怎么繪制空心矩形,也就是矩形線框

收藏
1條回答
Niceto 2022-12-26

在 DX11 中,你可以使用邊界著色器和輸出緩沖區(qū)(Output Merger)來繪制空心矩形,也就是矩形線框。

 

首先,你需要?jiǎng)?chuàng)建一個(gè)邊界著色器,并使用頂點(diǎn)著色器將頂點(diǎn)坐標(biāo)轉(zhuǎn)換成裁剪空間坐標(biāo)(Clip Space Coordinates)。然后,你可以使用邊界著色器的輸出緩沖區(qū)(Output Merger)來繪制空心矩形。

 

具體來說,你可以在邊界著色器中使用內(nèi)插(Interpolation)來繪制空心矩形。內(nèi)插是一種技術(shù),可以在頂點(diǎn)著色器和像素著色器之間插入一個(gè)過渡步驟,在這個(gè)步驟中,可以使用多種插值方法來控制像素著色器的輸出。
我提供了一份 C++ 代碼,展示了如何使用邊界著色器和輸出緩沖區(qū)來繪制空心矩形:

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
// 包含 DirectX 11 頭文件
#include <d3d11.h>
 
// 創(chuàng)建邊界著色器
ID3D11HullShader* pHullShader;
 
// 創(chuàng)建頂點(diǎn)著色器
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];"
        "}";
 
    // 創(chuàng)建邊界著色器
    D3DCompile(hullShaderCode, strlen(hullShaderCode), nullptr, nullptr, nullptr, "main", "hs_5_0", 0, 0, &pHullShader, nullptr);
}
 
// 初始化頂點(diǎn)著色器
void InitVertexShader()
{
    // 加載頂點(diǎn)著色器代碼
    const char* vertexShaderCode =
        "void main(float4 inPos : POSITION, out float4 outPos : SV_Position) {"
        "   outPos = inPos;"
        "}";
 
   // 創(chuàng)建頂點(diǎn)著色器
D3DCompile(vertexShaderCode, strlen(vertexShaderCode), nullptr, nullptr, nullptr, "main", "vs_5_0", 0, 0, &pVertexShader, nullptr);
}
 
// 初始化輸出緩沖區(qū)
void InitOutputBuffer()
{
    // 創(chuàng)建輸出緩沖區(qū)
    D3D11_BUFFER_DESC bufferDesc;
    bufferDesc.ByteWidth = sizeof(float) * 4;
    bufferDesc.Usage = D3D11_USAGE_DEFAULT;
    bufferDesc.BindFlags = D3D11_BIND_STREAM_OUTPUT;
    bufferDesc.CPUAccessFlags = 0;
    bufferDesc.MiscFlags = 0;
    bufferDesc.StructureByteStride = 0;
    pDevice->CreateBuffer(&bufferDesc, nullptr, &pOutputBuffer);
}
 
// 繪制空心矩形
void DrawHollowRectangle()
{
    // 設(shè)置邊界著色器和頂點(diǎn)著色器
    pContext->HSSetShader(pHullShader, nullptr, 0);
    pContext->VSSetShader(pVertexShader, nullptr, 0);
 
  }
回復(fù)