Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Colors 避免在cg着色器中循环瓶颈_Colors_Shader_Fragment Shader_Cg - Fatal编程技术网

Colors 避免在cg着色器中循环瓶颈

Colors 避免在cg着色器中循环瓶颈,colors,shader,fragment-shader,cg,Colors,Shader,Fragment Shader,Cg,我对Cg着色器有一个问题 我使用着色器来显示热图,因此它会根据屏幕区域与中心的距离来修改屏幕区域的颜色。问题是,如果我需要给许多区域上色,比如通过300个点,碎片需要在所有可见屏幕上循环太多次,在这种情况下,1920x1080x300,这显然是一个瓶颈,有没有办法只告诉我的着色器要上色的区域而不使其循环 half4 frag(vertOutput output) : COLOR { half h = 0; for (int i =

我对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;
        }
half4帧(垂直输出):颜色
{
半小时=0;
对于(int i=0;i<\u点\u长度;i++)
{
half dist=距离(output.worldPos,_Points[i].xyz);//_Points[i].xyz是我传递给着色器的点
半半径=_属性[i].x;//这是实际点周围区域的半径
半高=1-饱和(距离/半径);
h+=hi*\u属性[i].y;//属性[i].y只是一个强度修饰符
}
h=饱和(h);
half4颜色=tex2D(_heatetex,fixed2(h,0.5));
返回颜色;
}

只需付出最小的努力,您就可以将其渲染成一个纹理大小的一小部分。这似乎是纯粹的视觉,可能是低频和连续的,所以它应该很好地高档化(考虑到你有很好的细节,以充分的分辨率混合)。更糟糕的情况是,您需要一种稍微好一点的上采样方法

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

这里的底线是,您基本上是以最昂贵的方式渲染一个附加粒子系统:)您可以这样做:更新粒子系统CPU端(或动态执行网格,或执行四元网格的gpu实例化),将距离预计算到纹理中,并将强度作为颜色传递,渲染到纹理中(缩小或不缩小)。Bim!使用光栅化以获得其擅长:)