将 OpenGL 模板功能移植到 DirectX 11
Porting OpenGL stencil functionality to DirectX 11
我有一些用OpenGL编写的渲染代码。我使用模板缓冲区来实现剪辑:
//Let's assume this is done in render loop.
if(!already_created())
{
create_stencil_attachment_and_bind_to_FB_as_depth_stencil_attachment();
}
glEnable(GL_STENCIL_TEST);
glColorMask(0,0,0,0);
glDepthMask(0);
glClearStencil(0);
glClear(GL_STENCIL_BUFFER_BIT);
glStencilFunc(GL_ALWAYS,1,1);
glStencilOp(GL_REPLACE,GL_REPLACE,GL_REPLACE);
render_to_stencil();
glColorMask(1,1,1,1);
glDepthMask(1);
glStencilFunc(GL_EQUAL,1,1);
glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP);
render_with_clipping();
glDisable(GL_STENCIL_TEST);
现在,问题是,我需要将此代码移植到 DX11。我在MSDN上看到了示例和一些不错的教程。我最终得出这个逻辑:
1. 创建格式 = DXGI_FORMAT_D32_FLOAT_S8X24_UINT的 ID3D11纹理2D。2. 创建 ID3D11DepthStencilState 以渲染为模板://我们称之为DS_RENDER - 正面和背面: - OP = 所有 3 种情况的 D3D11_STENCIL_OP_REPLACE - 函数 = D3D11_COMPARISON_ALWAYS - 深度启用 = 假 - 模板启用 = 真 - 模板读取掩码 = 0xFF - 模板写入掩码 = 0xFF3. 为之前创建的状态和纹理创建 ID3D11DepthStencilView。我们称之为 DSV4. 创建 ID3D11DepthStencilState 以使用模板作为"输入"://我们称之为DS_CLIP - 正面和背面: - OP = 所有 3 种情况的 D3D11_STENCIL_OP_KEEP - 函数 = D3D11_COMPARISON_EQUAL - 深度启用 = 假 - 模板启用 = 真 - 模板读取掩码 = 0xFF - 模板写入掩码 = 0xFF
现在,我不确定如何将模具设置为目标或输入。
MSDN 说:
`pDevice->OMSetDepthStencilState(pDSState, 1);`
和
`pd3dDeviceContext->OMSetRenderTargets(1, &pRTV, pDSV);`
如果我正确理解这些调用,第一个设置模板状态,而第二个将 pDSV 绑定为渲染目标的附加"附件"。这是对的吗?
如果是这样,这会像我预期的那样工作吗?
pDevice->OMSetDepthStencilState(DS_RENDER, 1);
pd3dDeviceContext->OMSetRenderTargets(1, &pRTV, DSV);
render_geometry_to_stencil_buffer();
pDevice->OMSetDepthStencilState(DS_CLIP, 1);
render_geometry_with_clipping();
pd3dDeviceContext->OMSetRenderTargets(1, &pRTV, NULL); //Does this disable stencil testing?
提前感谢每一个帮助或有用的提示。
如果只想渲染到模具,请使用(设置写入状态(:
pd3dDeviceContext->OMSetRenderTargets(0, NULL, DSV);
无需渲染到颜色缓冲区,因此无需绑定它。
然后,要呈现到目标并启用模具测试,请使用:
pd3dDeviceContext->OMSetRenderTargets(1, &pRTV, DSV);
当你使用模板作为输入时,一个非常简单的事情也是设置 StencilWriteMask = 0;所以它永远不会写入它(这是你想要渲染剪裁的几何体(。
如果您使用:
pd3dDeviceContext->OMSetRenderTargets(1, &pRTV, NULL);
您确实会禁用任何形式的深度/模板测试(不再有深度限制,因此 DepthStencilState 将完全不起作用(。
此外,我会为您使用深度格式(个人偏好(DXGI_FORMAT_D24_UNORM_S8_UINT,它将非常适合您的用例并消耗更少的内存。
希望有帮助。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 在运行时加载OpenGL/DirectX API功能
- 将 OpenGL 模板功能移植到 DirectX 11
- 主功能和窗口,支持 Opengl 3.0+ 和 DirectX 10+
- 无法使用DirectX功能
- 运行DirectX代理功能*后*比*前*的原始功能