避免使cg着色器内部出现瓶颈

时间:2019-02-21 17:08:40

标签: colors shader fragment-shader 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;
        }

1 个答案:

答案 0 :(得分:1)

只需花费很少的精力,您就可以将其渲染为仅几分之一大小的纹理。它似乎是纯粹的视觉效果,并且可能是低频且连续的,因此它应该很好地进行放大(考虑到您有很好的细节可以与全分辨率融合)。更糟糕的是,您需要一种更好的上采样方法。

您还可以考虑使用更便宜的指令,例如使用平方距离进行计算,并通过传递反函数将半径除以乘数。

但是最重要的是,您实际上是在以最昂贵的方式渲染加性粒子系统:)您可以这样做:更新粒子系统CPU端(或在网格上进行网格划分)飞行或执行gpu实例化四边形),将距离预先计算为纹理,然后将强度作为颜色传递,渲染为纹理(是否缩小)。 im!使用光栅化有其优点:)