在开始之前,我做了一个很好的研究,这个问题是:
太笼统了;在研究第一个答案时,我想我需要混合状态,但是如何设置α比较并不明显。
搜索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的特殊功能的人,最后阶段使用比较函数来比较像素着色器输出的α值和参考值,然后实际绘制像素当且仅当比较返回一个真值时。
所有这些的最终结果是,控制纹理的亮度级别控制每个像素在过渡过程中的早期或后期变化。
那么,我该如何用DirectX 11来完成这个任务呢?
是的,我意识到还有其他方法可以达到同样的效果,把frameNum传递给一个精心制作的像素着色器可以把我带到同一个地方。
这不是重点,我不是在寻找替代的实现,我希望学习如何在DirectX 11中进行alpha比较,因为在DirectX 9中,它们不时被证明是一个有用的工具。
发布于 2017-07-14 01:19:39
如果您要从Direct3D 9迁移到Direct3D 11,在Direct3D 10中做一个简短的停留是很有用的,这一点将在MSDN中详细介绍。该条的要点之一是:
固定函数的去除 有时令人惊讶的是,即使在完全利用可编程流水线的Direct3D 9引擎中,仍然有许多领域依赖于固定功能(FF)流水线。最常见的区域通常与UI的屏幕空间对齐呈现相关。正是由于这个原因,您可能需要构建一个FF模拟着色器或一组着色器,以提供必要的替换行为。 此文档包含一个白皮书,其中包含最常见的FF行为的替换着色器源(请参阅固定函数EMU示例)。一些固定功能的像素行为,包括alpha测试,已经移到着色器中。
IOW: --在Direct3D 10或更高版本的可编程着色器中执行此操作。
看看DirectX工具包,特别是AlphaTestEffect (在这个cpp和着色器文件中实现)。
https://stackoverflow.com/questions/45072709
复制相似问题