首页
社区
课程
招聘
DX11 绘制空心矩形

DX11 怎么绘制空心矩形,也就是矩形线框

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

在 DX11 中,你可以使用边界着色器和输出缓冲区(Output Merger)来绘制空心矩形,也就是矩形线框。

 

首先,你需要创建一个边界着色器,并使用顶点着色器将顶点坐标转换成裁剪空间坐标(Clip Space Coordinates)。然后,你可以使用边界着色器的输出缓冲区(Output Merger)来绘制空心矩形。

 

具体来说,你可以在边界着色器中使用内插(Interpolation)来绘制空心矩形。内插是一种技术,可以在顶点着色器和像素着色器之间插入一个过渡步骤,在这个步骤中,可以使用多种插值方法来控制像素着色器的输出。
我提供了一份 C++ 代码,展示了如何使用边界着色器和输出缓冲区来绘制空心矩形:

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>
 
// 创建边界着色器
ID3D11HullShader* pHullShader;
 
// 创建顶点着色器
ID3D11VertexShader* pVertexShader;
 
// 创建输出缓冲区
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, 0, &pHullShader, nullptr);
}
 
// 初始化顶点着色器
void InitVertexShader()
{
    // 加载顶点着色器代码
    const char* vertexShaderCode =
        "void main(float4 inPos : POSITION, out float4 outPos : SV_Position) {"
        "   outPos = inPos;"
        "}";
 
   // 创建顶点着色器
D3DCompile(vertexShaderCode, strlen(vertexShaderCode), nullptr, nullptr, nullptr, "main", "vs_5_0", 0, 0, &pVertexShader, nullptr);
}
 
// 初始化输出缓冲区
void InitOutputBuffer()
{
    // 创建输出缓冲区
    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()
{
    // 设置边界着色器和顶点着色器
    pContext->HSSetShader(pHullShader, nullptr, 0);
    pContext->VSSetShader(pVertexShader, nullptr, 0);
 
  }
回复