Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.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
iphoneglsl动态分支行为_Iphone_Objective C_Branch_Glsl_Shader - Fatal编程技术网

iphoneglsl动态分支行为

iphoneglsl动态分支行为,iphone,objective-c,branch,glsl,shader,Iphone,Objective C,Branch,Glsl,Shader,我知道分支不是编写着色器的好主意,但我还没有想到一种方法来避免它。以下是我的片段着色器代码: precision highp float; varying vec4 v_fragmentColor; varying vec4 v_pos; uniform int u_numberOfParticles; uniform mat4 u_MVPMatrix; uniform vec3 u_waterVertices[100]; void main() { vec4 finalCol

我知道分支不是编写着色器的好主意,但我还没有想到一种方法来避免它。以下是我的片段着色器代码:

precision highp float;

varying vec4 v_fragmentColor;
varying vec4 v_pos;

uniform int u_numberOfParticles;

uniform mat4 u_MVPMatrix;

uniform vec3 u_waterVertices[100];

void main()
{
    vec4 finalColor = vec4(0.0, 0.0, 0.0, 0.0)

    vec2 currPos = v_pos.xy;

    float accum = 0.0;
    vec3 normal = vec3(0, 0, 0);

    for ( int i = 0; i < u_numberOfParticles; ++i )
    {
        // Some calculations here
    }
    normal = normalize(normal);

    float normalizeToEdge = 1.0 - (accum - threshold) / 2.0;

    if (normalizeToEdge < 0.3)
        finalColor = vec4( 0.1, normalizeToEdge + 0.5, 0.9-normalizeToEdge*0.4, 1.0);

    if ( normalizeToEdge < 0.2 )
    {
        finalColor = vec4( 120.0/255.0, 245.0/255.0, 245.0/255.0, 1.0);
        float shade = mix( 0.7, 1.0, normal.x);
        finalColor *= shade;
    }


    gl_FragColor = vec4(finalColor);

}
问题在于:

for ( int i = 0; i < u_numberOfParticles; ++i )
{
     // Some calculations here
}
将其更改为:

for ( int i = 0; i < 2; ++i )
{
    // Some calculations here
}
即使u_numberOfParticles也是2,也会加倍帧速率

改成

   for ( int i = 0; i < 100; ++i )
   {
       if( i == u_numberOfParticles)
            break;
       // Some calculations here
   }
不提供任何fps改进


我如何应对这种行为?是否有任何技术可以避免这种分支?我认为为不同数量的粒子编写50个不同的着色器是低效的。。。任何帮助都将不胜感激。

如果您将常量放在那里,编译器可能会觉得需要优化循环,使其在一行中执行相同的操作2倍,这可能会提高性能。动态变量是动态的,不能在编译时进行优化。@scones但我认为应该有一个解决方案,人们可以用它来处理此类问题。我只是不能使它保持不变,因为粒子的数量在不同的情况下是不同的。