避免在CG着色器内部循环瓶颈



我对CG着色器有问题。

我正在使用着色器显示热图,因此它根据其离中心的距离来修饰屏幕区域的颜色。问题是,如果我需要为许多区域(例如通过300点)上色,那么片段需要循环遍历所有可见的屏幕,在这种情况下,1920x1080x300显然是瓶颈,只有一种方法可以告诉我的着色器上着色的区域而不使其循环?

half4 frag(vertOutput output) : COLOR 
        {
            half h = 0;
            for (int i = 0; i < _Points_Length; i ++)
            {
                half dist = distance(output.worldPos, _Points[i].xyz);//_Points[i].xyz is the point I'm passing to my shader
                half radi = _Properties[i].x; //this is the radius of the area around the actual point
                half hi = 1 - saturate(dist / radi);
                h += hi * _Properties[i].y; //Properties[i].y is just an intensity modifier
            }
            h = saturate(h);
            half4 color = tex2D(_HeatTex, fixed2(h, 0.5));
            return color;
        }

在最低限度的努力下,您可以将其呈现成大小的一小部分的质地。它似乎纯粹是视觉的,并且可能是低频且连续的,因此应该很好地提高(考虑到您在Full Res上有很好的详细信息)。更糟糕的情况您需要一个更好的上采样方法。

您还可以考虑使用较便宜的说明,例如使用平方距离计算并将半径划分为乘法通过倒数。

但是这里的底线是您本质上以最昂贵的方式渲染一个添加粒子系统:)您可以做到这一点苍蝇,或对四方的gpu实例)将距离预先计算成纹理,并将强度作为颜色传递到质地(尺寸较小)。BIM!使用栅格化的效果:)

最新更新