DX11 怎么绘制空心矩形,也就是矩形线框
在 DX11 中,你可以使用边界着色器和输出缓冲区(Output Merger)来绘制空心矩形,也就是矩形线框。
首先,你需要创建一个边界着色器,并使用顶点着色器将顶点坐标转换成裁剪空间坐标(Clip Space Coordinates)。然后,你可以使用边界着色器的输出缓冲区(Output Merger)来绘制空心矩形。
具体来说,你可以在边界着色器中使用内插(Interpolation)来绘制空心矩形。内插是一种技术,可以在顶点着色器和像素着色器之间插入一个过渡步骤,在这个步骤中,可以使用多种插值方法来控制像素着色器的输出。我提供了一份 C++ 代码,展示了如何使用边界着色器和输出缓冲区来绘制空心矩形:
/
包含 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
, &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);
初始化输出缓冲区
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,