在开始之前我有一个很好的搜索,这个问题:
How to set RenderState in DirectX11?
太普遍了;在研究第一个答案时,我怀疑我需要混合状态,但是如何设置alpha比较并不明显。
为D3DRS_ALPHAREF搜索堆栈溢出只产生了其他七个问题:https://stackoverflow.com/search?q=D3DRS_ALPHAREF其中没有一个甚至是远程关闭。
我正在使用它来执行一个两遍渲染以从一个图像转换到另一个图像的程序。我的控件纹理与我正在渲染的纹理大小相同,并且是单通道亮度。
我的像素着色器的最后几行是:
// Copy rgb from the source texture
out.color.rgb = source.color.rgb;
// copy alpha from the control texture.
out.color.a = control.color.r;
return out;
然后在我的渲染设置中,我有:
DWORD const reference = static_cast<DWORD>(frameNum);
D3DCMPFUNC const compare = pass == 0 ? D3DCMP_GREATEREQUAL : D3DCMP_LESS;
m_pd3dDevice->SetRenderState(D3DRS_ALPHAREF, reference);
m_pd3dDevice->SetRenderState(D3DRS_ALPHAFUNC, compare);
其中frameNum是转换的当前帧编号:0到255。
- 编辑 - 对于那些不太熟悉DirectX 9的这种特殊功能的人来说,最后一个阶段使用比较功能来比较像素着色器的alpha输出和参考值,然后实际绘制像素iff比较返回一个真值。
所有这一切的最终结果是控制纹理的亮度级别控制每个像素在转换中的早期或晚期变化。
那么,我究竟如何使用DirectX 11进行此操作?
是的,我意识到还有其他方法可以达到相同的效果,将frameNum传递给一个经过精心设计的像素着色器可以让我到达同一个地方。
这不是重点,我不是在寻找替代实现,我希望学习如何在DirectX 11中进行alpha比较,因为它们在DirectX 9中不时被证明是一种有用的工具。
答案 0 :(得分:1)
如果您从Direct3D 9迁移到Direct3D 11,可以暂时停止Direct3D 10中的更改。MSDN详细介绍了这一点。该文章的其中一点是:
删除固定功能
有时令人惊讶的是,即使在完全利用可编程管道的Direct3D 9引擎中,仍然存在许多依赖于固定功能(FF)管道的区域。最常见的区域通常与UI的屏幕空间对齐呈现相关。因此,您可能需要构建一个FF仿真着色器或一组着色器,以提供必要的替换行为。
本文档包含一份白皮书,其中包含最常见FF行为的替换着色器源(请参阅固定功能动车组示例)。包括alpha测试在内的一些固定功能像素行为已移至着色器中。
IOW:您可以在Direct3D 10或更高版本的可编程着色器中执行此操作。
查看DirectX Tool Kit,尤其是AlphaTestEffect(在此cpp和shader文件中实施)。