Shader 循环嵌套语句实现

时间:2022-09-08 12:08:10
请教大家个问题,大家知道在shader语句中如何进行多个条件的分支判断的实现么,好像HLSL这样的都不支持如C++中if的嵌套实现,怎么办呢?
C++中如下代码该在shader中如何实现?
if ( gender == MALE )
        {
            if ( age < 14 )
                printf("Hey! Boy.\n");
            else if ( age > 14 )
                     printf("Hi! Guy.\n");
          }
 else
       printf("Hi! Girl.\n"); 

13 个解决方案

#1


应该支持的吧,难道我小白了?

#2


跟你的显卡有关;
不知楼主什么环境,或许与你的编译设置也有关;
好像只是model 1.X不支持吧;你在支持model 3.0的显卡上试试.

#3


这样可以的吗?

#4


if嵌套?

#5


shader mode 3.0 以后简单语法跟C++基本上一样,lz说的完全可以实现

#6


这个本来就支持的 -- b 看看你的代码 = =

#7




float4x4 WorldViewProj : WorldViewProjection;

float4 mainVS(float3 pos : POSITION) : POSITION{
return mul(float4(pos.xyz, 1.0), WorldViewProj);
}

float4 mainPS(float2 texCoord : TEXCOORD0) : COLOR {

if (texCoord.x > 1.f)
return float4(1, 0, 0, 0);
else if (texCoord.x > 0.5)
{
if (texCoord.x > 0)
return float4(0, 1, 0, 0);
else
return float4(0, 0, 1, 0);
}
else
return float4(1.0, 1.0, 1.0, 1.0);
}

technique technique0 {
pass p0 {
VertexShader = compile vs_2_0 mainVS();
PixelShader = compile ps_2_0 mainPS();
}
}


比如这样是可以的,不过还要看sm的版本,上面的代码ps1.0是不支持的,但2.0以上就可以了

#8


SM4 和 5 都支持循环和嵌套 而且不仅仅支持嵌套 还能指定嵌套次数 不仅仅提供分支流程 还支持同时运行分支最后根据结果采用那个分支。

#9


该回复于2011-04-11 10:47:09被版主删除

#10


一直用s_m2、3的路过。。

#11


俺觉得Shader中不支持的应当是递归

#12


分支、循环跟shader版本有关。而且各个版本的寄存器数也是不一样的,分支多了寄存器也是个大问题。

#13


递归要看怎么写,简单的递归3.0以后也是支持的。

#1


应该支持的吧,难道我小白了?

#2


跟你的显卡有关;
不知楼主什么环境,或许与你的编译设置也有关;
好像只是model 1.X不支持吧;你在支持model 3.0的显卡上试试.

#3


这样可以的吗?

#4


if嵌套?

#5


shader mode 3.0 以后简单语法跟C++基本上一样,lz说的完全可以实现

#6


这个本来就支持的 -- b 看看你的代码 = =

#7




float4x4 WorldViewProj : WorldViewProjection;

float4 mainVS(float3 pos : POSITION) : POSITION{
return mul(float4(pos.xyz, 1.0), WorldViewProj);
}

float4 mainPS(float2 texCoord : TEXCOORD0) : COLOR {

if (texCoord.x > 1.f)
return float4(1, 0, 0, 0);
else if (texCoord.x > 0.5)
{
if (texCoord.x > 0)
return float4(0, 1, 0, 0);
else
return float4(0, 0, 1, 0);
}
else
return float4(1.0, 1.0, 1.0, 1.0);
}

technique technique0 {
pass p0 {
VertexShader = compile vs_2_0 mainVS();
PixelShader = compile ps_2_0 mainPS();
}
}


比如这样是可以的,不过还要看sm的版本,上面的代码ps1.0是不支持的,但2.0以上就可以了

#8


SM4 和 5 都支持循环和嵌套 而且不仅仅支持嵌套 还能指定嵌套次数 不仅仅提供分支流程 还支持同时运行分支最后根据结果采用那个分支。

#9


该回复于2011-04-11 10:47:09被版主删除

#10


一直用s_m2、3的路过。。

#11


俺觉得Shader中不支持的应当是递归

#12


分支、循环跟shader版本有关。而且各个版本的寄存器数也是不一样的,分支多了寄存器也是个大问题。

#13


递归要看怎么写,简单的递归3.0以后也是支持的。