Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
If statement HLSL'中的条件运算符;s通行证_If Statement_Conditional_Shader_Direct3d_Hlsl - Fatal编程技术网

If statement HLSL'中的条件运算符;s通行证

If statement HLSL'中的条件运算符;s通行证,if-statement,conditional,shader,direct3d,hlsl,If Statement,Conditional,Shader,Direct3d,Hlsl,据 HLSL支持条件运算符(从版本2.0开始?我使用的是4_0) 我需要在每次绘制调用之前设置混合状态。在FX文件中,我正在执行以下操作: BlendState BlendNone { AlphaToCoverageEnable = FALSE; BlendEnable[0] = FALSE; }; BlendState BlendSrcAlphaOne { BlendEnable[0] = TRUE; SrcBlend = SRC_ALPHA; Des

HLSL支持条件运算符(从版本2.0开始?我使用的是4_0)

我需要在每次绘制调用之前设置混合状态。在FX文件中,我正在执行以下操作:

BlendState BlendNone
{
    AlphaToCoverageEnable = FALSE;
    BlendEnable[0] = FALSE;
};
BlendState BlendSrcAlphaOne
{
    BlendEnable[0] = TRUE;
    SrcBlend = SRC_ALPHA;
    DestBlend = INV_SRC_ALPHA;
    BlendOp = ADD;
    RenderTargetWriteMask[0] = 0x0F;
};
BlendState BlendSrcAlphaOneMinusSrcAlpha
{
    BlendEnable[0] = TRUE;
    SrcBlend = SRC_ALPHA;
    DestBlend = ONE;
    BlendOp = ADD;
    RenderTargetWriteMask[0] = 0x0F;
};
int g_Blend;

technique10 Render
{
    pass P0
    {
        SetVertexShader( CompileShader( vs_4_0, VS() ) );
        SetGeometryShader( CompileShader( gs_4_0, GS() ) );
        SetPixelShader( CompileShader( ps_4_0, PS() ) );

        SetRasterizerState(rsCullNone);
        SetDepthStencilState( EnableDepth, 0 );

        if (g_Blend == 0)
        {
            SetBlendState( BlendNone, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );
        }
        else if (g_Blend == 1)
        {
            SetBlendState( BlendSrcAlphaOne, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );
        }
        else if (g_Blend == 2)
        {
            SetBlendState( BlendSrcAlphaOneMinusSrcAlpha, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );
        }
    }
}
这不会编译时出错: 错误X3000:语法错误:意外标记“if”

如果我将整个块移动到一个单独的函数中,如:

void setBlend()
{
        if (g_Blend == 0)
        {
            SetBlendState( BlendNone, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );
        }
        else if (g_Blend == 1)
        {
            SetBlendState( BlendSrcAlphaOne, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );
        }
        else if (g_Blend == 2)
        {
            SetBlendState( BlendSrcAlphaOneMinusSrcAlpha, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );
        }
}

technique10 Render
{
    pass P0
    {
        SetVertexShader( CompileShader( vs_4_0, VS() ) );
        SetGeometryShader( CompileShader( gs_4_0, GS() ) );
        SetPixelShader( CompileShader( ps_4_0, PS() ) );

        SetRasterizerState(rsCullNone);
        SetDepthStencilState( EnableDepth, 0 );

        setBlend();
    }
}
它没有编译时出错: 错误X3000:此FX API在您的程序(SetBlendState)的此部分中不可用


那么,在经过多次尝试和阅读后,HLSL中是否支持if?

正常

这包括:

BlendState blendStates[3]
{
    {
        AlphaToCoverageEnable = FALSE;
        BlendEnable[0] = FALSE;
    },
    {
        BlendEnable[0] = TRUE;
        SrcBlend = SRC_ALPHA;
        DestBlend = INV_SRC_ALPHA;
        BlendOp = ADD;
        RenderTargetWriteMask[0] = 0x0F;
    },
    {
        BlendEnable[0] = TRUE;
        SrcBlend = SRC_ALPHA;
        DestBlend = ONE;
        BlendOp = ADD;
        RenderTargetWriteMask[0] = 0x0F;
    }
};
int g_Blend;

technique10 Render
{
    pass P0
    {
        SetVertexShader( CompileShader( vs_4_0, VS() ) );
        SetGeometryShader( CompileShader( gs_4_0, GS() ) );
        SetPixelShader( CompileShader( ps_4_0, PS() ) );

        SetRasterizerState(rsCullNone);
        SetDepthStencilState( EnableDepth, 0 );

        SetBlendState( blendStates[g_Blend], float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );
    }
}
SetBlendState严格来说不是函数调用,并且不允许在过程{}中使用条件运算符。但是,它可以通过索引传递状态对象数组,而不仅仅是状态对象