首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是DirectX 11等价于dev->SetRenderState(D3DRS_ALPHAREF,值);

什么是DirectX 11等价于dev->SetRenderState(D3DRS_ALPHAREF,值);
EN

Stack Overflow用户
提问于 2017-07-13 06:14:30
回答 1查看 1.1K关注 0票数 0

在开始之前,我做了一个很好的研究,这个问题是:

如何在RenderState中设置DirectX11?

太笼统了;在研究第一个答案时,我想我需要混合状态,但是如何设置α比较并不明显。

搜索D3DRS_ALPHAREF的堆栈溢出只产生了其他七个问题:阿尔法勒夫,甚至没有一个问题是远程关闭的。

我把它用于一个程序,它可以从一个图像到另一个图像进行两次呈现。我有一个控制纹理,是相同大小的纹理,我正在渲染,是单通道亮度。

我的像素着色器的最后一行是:

代码语言:javascript
复制
// 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;

那么在我的渲染设置中,我有:

代码语言:javascript
复制
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中,它们不时被证明是一个有用的工具。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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着色器文件中实现)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45072709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档