我们已经编写了 GLSL 着色器代码来使用 GPU 进行光线追踪可视化。在光线行进循环中设置提前退出中断似乎是非常标准的,因此如果光线熄灭,循环就会中断。

但是根据我对 GPU 代码的了解,每次渲染将花费最长的循环运行时间。所以我的问题是:是否值得提前退出?

例如

for(int i = 0; i < MAX_STEPS; i++){
        //Get the voxel intensity value from the 3D texture.
        dataRGBA = getRGBAfromDataTex(dataTexture, currentPosition, dataShape, textureShape);

        // get contribution from the light
        lightRayPathRGBA = getPathRGBA(currentPosition, light.position, steps, tex); // this is the light absorbed so we need to take 1.0- to get the light transmitted
        lightRayRGBA = (vec4(1.0) - lightRayPathRGBA) * vec4(light.color, light.intensity);

        apparentRGB = (1.0 - accumulatedAlpha) * dataRGBA.rgb * lightRayRGBA.rgb * dataRGBA.a * lightRayRGBA.a;
        //apparentRGB = (1.0 - accumulatedAlpha) * dataRGBA.rgb * dataRGBA.a * lightRayRGBA.a;

        //Perform the composition.
        accumulatedColor += apparentRGB;
        //Store the alpha accumulated so far.
        accumulatedAlpha += dataRGBA.a;

        //Adva      nce the ray.
        currentPosition += deltaDirection;
        accumulatedLength += deltaDirectionLength;

        //If the length traversed is more than the ray length, or if the alpha accumulated reaches 1.0 then exit.
        if(accumulatedLength >= rayLength || accumulatedAlpha >= 1.0 ){
            break;
        }
    }

最佳答案

GPU 的调度单位是扭曲/波前。通常是 32 或 64 个线程的连续组。一个扭曲的执行时间是该扭曲内所有线程的最大执行时间。

因此,如果您的提前退出可以使整个扭曲更快终止(例如,如果线程 0 到 31 都提前退出),那么是的,这是值得的,因为硬件可以安排另一个扭曲来执行,从而减少了整体内核运行时。否则,它可能不是,因为即使线程 1 到 31 提前退出,warp 仍会占用硬件,直到线程 0 完成。

关于opengl-es - GPU 上的循环提前退出值得做吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30256579/

10-13 09:45