✅ ID3D11DeviceContext 相关的所有 Get 函数列表
🧠 着色器阶段相关(VS / PS / GS / HS / DS / CS)
每个着色器阶段都有如下几组 Get 函数(共通):
函数 | 含义:获取… |
---|
*GetShader(...) | 着色器对象(VS/PS/GS/HS/DS/CS) |
*GetShaderResources(...) | 绑定的 SRV |
*GetConstantBuffers(...) | 绑定的常量缓冲区 |
*GetSamplers(...) | 绑定的采样器状态 |
*具体函数如下( 代表 VS/PS/GS/HS/DS/CS):**
VSGetShader
VSGetShaderResources
VSGetConstantBuffers
VSGetSamplers
PSGetShader
PSGetShaderResources
PSGetConstantBuffers
PSGetSamplers
GSGetShader
GSGetShaderResources
GSGetConstantBuffers
GSGetSamplers
HSGetShader
HSGetShaderResources
HSGetConstantBuffers
HSGetSamplers
DSGetShader
DSGetShaderResources
DSGetConstantBuffers
DSGetSamplers
CSGetShader
CSGetShaderResources
CSGetUnorderedAccessViews
CSGetConstantBuffers
CSGetSamplers
CSGetShader
🧱 输入装配阶段(Input Assembler)
函数 | 含义 |
---|
IAGetInputLayout | 获取输入布局对象(Input Layout) |
IAGetVertexBuffers | 获取绑定的顶点缓冲区 |
IAGetIndexBuffer | 获取绑定的索引缓冲区 |
IAGetPrimitiveTopology | 获取图元拓扑类型(如 TRIANGLELIST) |
🧩 光栅化阶段(Rasterizer Stage)
函数 | 含义 |
---|
RSGetState | 获取光栅化状态 |
RSGetViewports | 获取视口数组 |
RSGetScissorRects | 获取裁剪矩形 |
🎨 输出合并阶段(Output Merger)
函数 | 含义 |
---|
OMGetRenderTargets | 获取绑定的 RTV + DSV |
OMGetRenderTargetsAndUnorderedAccessViews | 获取 RTV + DSV + UAV(DX11.1+) |
OMGetBlendState | 获取混合状态 |
OMGetDepthStencilState | 获取深度/模板状态 |
🔁 计算着色器特有
函数 | 含义 |
---|
CSGetUnorderedAccessViews | 获取绑定的 UAV(不可用于其他阶段) |
📦 Stream Output(流输出)
函数 | 含义 |
---|
SOGetTargets | 获取绑定的 Stream Output 缓冲区 |
📌 附加:资源释放注意
所有 Get*
函数获取到的 COM 对象都会增加引用计数,使用完后需要调用 ->Release()
释放,防止内存泄露。
✅ 参考示例:遍历所有 VS 阶段资源
ID3D11VertexShader* pVS = nullptr;
ID3D11ShaderResourceView* srvs[D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT] = {};
ID3D11Buffer* cbuffers[D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT] = {};
context->VSGetShader(&pVS, nullptr, nullptr);
context->VSGetShaderResources(0, D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT, srvs);
context->VSGetConstantBuffers(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT, cbuffers);
if (pVS) pVS->Release();
for (auto srv : srvs) if (srv) srv->Release();
for (auto cb : cbuffers) if (cb) cb->Release();