If statement HLSL'中的条件运算符;s通行证
据 HLSL支持条件运算符(从版本2.0开始?我使用的是4_0) 我需要在每次绘制调用之前设置混合状态。在FX文件中,我正在执行以下操作: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
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严格来说不是函数调用,并且不允许在过程{}中使用条件运算符。但是,它可以通过索引传递状态对象数组,而不仅仅是状态对象