javascript - Webgl Angular 循环非常慢

标签 javascript opengl-es glsl webgl angle

我这里有一些 glsl,它的作用就像一个魅力。仅编译就需要3分钟左右。我知道这是由于angle造成的,Angle是一款将opengl es 2.0代码转换为windows系统上webgl的directX 9的软件。如果我禁用 Angular ,它会在一秒钟内编译。有谁知道为什么嵌套循环的 Angular 太慢。如果有解决办法吗?我的意思是我不能让每个人为每个着色器等待超过一分钟。

for ( int b = 0; b < numberOfSplitpoints; b++ ) {
    if ( cameraDepth > splitPoints[b] && cameraDepth < splitPoints[b+1] ) {
        const float numberOfSplitpoints = float( NUMBER_OF_SPLIT_POINTS - 1 );
        vec4 projCoords = v_projTextureCoords[b];

        projCoords /= projCoords.w;
        projCoords = 0.5 * projCoords + 0.5;

        float shadowDepth = projCoords.z;

        projCoords.x /= numberOfSplitpoints;
        projCoords.x += float(b) / numberOfSplitpoints;


        for( int x = 0; x < fullkernelSize; x++ ) {
            for( int y = 0; y < fullkernelSize; y++ ) {
                vec2 pointer = vec2( float(x-kernelsize) / 3072.0, float(y-kernelsize) / 1024.0 );
                float convolution = kernel[x] * kernel[y];
                vec4 color = texture2D(shadowMapSampler, projCoords.xy+pointer);

                if(encodeDepth( color ) + shadowBias > shadowDepth) {
                    light += convolution;
                } else {
                    light += convolution * 0.6;
                }
            }
        } 
    }
}

vec2 random = normalize(texture2D(randomSampler, screenSize * uv / 64.0).xy * 2.0 - 1.0);
float ambiantAmount = 0.0;

const int kernel = 4;

float offset = ssoasampleRad / depth;


for(int x = 0; x<kernel; x++) {

    vec2 a  = reflect(directions[x], random) * offset;

    vec2 b  = vec2( a.x *0.707 - a.y*0.707, 
                    a.x*0.707 + a.y*0.707 );

    ambiantAmount += abientOcclusion(uv, a*0.25, position, normal);
    ambiantAmount += abientOcclusion(uv, b*0.50, position, normal);
    ambiantAmount += abientOcclusion(uv, a*0.75, position, normal);
    ambiantAmount += abientOcclusion(uv, b, position, normal);
}

最佳答案

GLSL ES 未强制定义 while 循环和“动态”有界 for 循环。 ANGLE 利用这一点并进行广泛的循环展开: 如果您有for ( int b = 0; b < numberOfSplitpoints; b++ )numberOfSplitpoints必须是常量表达式,否则着色器将无法编译。

循环展开应该允许 native 着色器优化器进行更多优化并最大限度地减少分歧,但是(在您的代码中)如果您有 numberOfSplitpointsfullkernelSize非常大,展开的代码可能会变得非常长(最里面的代码将被重复 numberOfSplitpoints*fullkernelSize*fullkernelSize 次),这可能会导致优化器和编译器陷入各种麻烦。

关于javascript - Webgl Angular 循环非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11282432/

相关文章:

javascript - 创建JS : Get the ACTUAL bound area after the object has been rotated

android - 在 Android OpenGL 类(class)上工作无法弄清楚我做错了什么

java - 为什么 eclipse 用颜色填充我的纹理?

c++ - 如何在顶点着色器中使用 LookAt 矩阵

glsl - 您可以在 GLSL 着色器中通过引用传递矩阵吗?

javascript - 使用 Javascript 显示 2 个随机数

javascript - $ ('#div' ).bind ('scroll' 函数({})) 不起作用

opengl - 如何在四边形上对法线进行双线性插值?

c++ - 正确的 GLSL 无绑定(bind)纹理句柄中的结构布局

javascript - 滚动时透明导航栏可见