我有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;
}
只需最小的努力,您就可以将其渲染为纹理的一小部分。它似乎纯粹是视觉的,可能是低频和连续的,所以它应该很好地升级(考虑到你有很好的细节与完整的res混合)。更糟糕的情况是你需要一个稍好的上采样方法。
您还可以考虑使用更便宜的指令,例如使用平方距离进行计算,并通过传递反转将半径除以转换为乘法。
但这里的底线是,你实际上是以最昂贵的方式渲染添加剂粒子系统:)你可以做到这一点:更新粒子系统CPU端(或动态做一个网格,或做四边形的GPU实例化) ),预先计算到纹理的距离并将强度作为颜色传递,渲染成纹理(缩小或不缩小)。 Bim!使用光栅化来擅长:)