colors - 避免在 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;
}
解决方案
只需最少的努力,您就可以将其渲染成一小部分大小的纹理。它似乎是纯视觉的,并且可能是低频和连续的,因此它应该很好地升级(考虑到你有很好的细节可以在全分辨率下融合)。更糟糕的情况是你需要一个更好的上采样方法。
您还可以考虑使用更便宜的指令,例如使用平方距离进行计算,并通过传递倒数将该半径除以乘法。
但这里的底线是,您实际上是以最昂贵的方式渲染附加粒子系统 :) 您可以这样做:更新粒子系统 CPU 端(或动态执行网格,或执行四边形的 gpu 实例化),将距离预先计算为纹理并将强度作为颜色传递,渲染为纹理(缩小或不缩小)。比姆!使用光栅化来做它擅长的事情:)
推荐阅读
- java - Android - 在 Fragment 中设置 BottomSheet 中 FAB 按钮的可见性
- spring-boot - 在 JPA 中使用 findByField 选择多个字段
- c - Posix 串行端口原始读取挂起
- javascript - Little problem with accordion-menu (hide/show)
- symfony - @UniqueEntity 不强制执行多字段约束
- r - 带 tidyr 巢的滑动窗
- css - 如何在没有Javascript或Jquery的另一个类之前标记包含类的元素?
- python - 卡在循环中,或者在使用交互时无法捕获点击事件。我需要更改什么?
- python - Pyspark Shell 中的 HiveMetaStore 错误,但在 Jupyter Notebook 中没有
- c++ - 移动构造函数和移动赋值运算符与复制省略