与第 9 版相比,DirectX 11 中缺少一些属性

问题描述 投票:0回答:1

目前,我正在将旧代码从 DirectX 第九版移植到较新的第十一版,并且在寻找现有属性和函数的类似物方面遇到了一些困难。

旧版本(DirectX9)中的显示选项:

technique tAccessory
{
    pass p0
    {
        VS_COMPILE_COMMAND VS();
        PS_COMPILE_COMMAND PS(true);
        
        AlphaBlendEnable    = true;
        SrcBlend            = SrcAlpha;
        DestBlend           = InvSrcAlpha;
        ZFunc               = LESSEQUAL;
        AlphaTestEnable     = true;
        AlphaRef            = 1;
        AlphaFunc           = GreaterEqual;
    }

    pass p1
    {
        VS_COMPILE_COMMAND VS();
        PS_COMPILE_COMMAND PSAccessoryAlpha();
        
        AlphaBlendEnable    = true;
        SrcBlend            = SrcAlpha;
        DestBlend           = One;
        ZFunc               = LESSEQUAL;
        AlphaTestEnable     = true;
        AlphaRef            = 1;
        AlphaFunc           = GreaterEqual;
    }
}

VS, PS, PSAccessoryAlpha
函数是自写的,确定纹理和alpha的位置。 问题在于新版本的 DirectX 11 中没有这些参数:

AlphaBlendEnable    = true;
SrcBlend            = SrcAlpha;
DestBlend           = One;
ZFunc               = LESSEQUAL;
AlphaTestEnable     = true;
AlphaRef            = 1;
AlphaFunc           = GreaterEqual;

我发现可以使用

SetBlendState
功能设置以下参数:

DirectX9:

AlphaBlendEnable    = true;
SrcBlend            = SrcAlpha;
DestBlend           = InvSrcAlpha;

DirectX11:

BlendState BSAlphaBlending
{
    BlendEnable[0] = true;
    SrcBlend  = SRC_ALPHA;
    DestBlend = INV_SRC_ALPHA;
};
SetBlendState( BSAlphaBlending, float4( 0, 0, 0, 0 ), 0xffffffff );

对于

DestBlend = One
时的情况:

DirectX9:

AlphaBlendEnable    = true;
SrcBlend            = SrcAlpha;
DestBlend           = One;

DirectX11:

BlendState BSSrcAlphaDestOne
{
    BlendEnable[0]  = true;
    SrcBlend        = SRC_ALPHA;
    DestBlend       = ONE;
};
SetBlendState( BSSrcAlphaDestOne, float4( 0, 0, 0, 0 ), 0xffffffff );

但是我还没有弄清楚如何将其余参数移植到DirectX11,例如:

DirectX9:

ZFunc               = LESSEQUAL;
AlphaTestEnable     = true;
AlphaRef            = 1;
AlphaFunc           = GreaterEqual;

在版本 9 中,它们有一个

D3DRENDERSTATETYPE
枚举,并且可以使用
SetRenderState
函数指定必要的参数,但是版本 11 中此函数的类似物是什么?

c# shader directx directx-11 directx-9
1个回答
0
投票

首先,您使用的是旧版效果 (FX) 系统,因此请务必查看 GitHub 了解最新版本和限制。

对于 Direct3D 11,您需要计算出状态组合排列并为它们创建状态对象(您有 5 个对象需要设置,而不是一百个小的单独开关)。例如,ZFunc 是 DepthStencilState 对象的一部分。

请参阅 Microsoft Docs 和这些 C++ 示例。您所处理的大多数结构更改也适用于 Direct3D 10。

© www.soinside.com 2019 - 2024. All rights reserved.