Избегайте зацикливания узкого места внутри cg-шейдера - PullRequest
0 голосов
/ 21 февраля 2019

У меня проблема с шейдерами 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 голосов
/ 31 марта 2019

С минимальными усилиями вы можете просто визуализировать это в текстуру на доли размера.Кажется, что он чисто визуальный, и, вероятно, низкочастотный и непрерывный, поэтому он должен хорошо масштабироваться (учитывая, что у вас есть хорошие детали, которые можно смешивать с полным разрешением).В худшем случае вам понадобится немного лучший метод повышения дискретизации.

Вы также можете использовать более дешевые инструкции, такие как вычисление с использованием квадратного расстояния и превращение этого радиуса в кратное, передавая обратное значение.

Но Суть в том, что вы по сути визуализируете аддитивную систему частиц самым дорогим способом :) Вы можете сделать это просто: обновить сторону ЦП системы частиц (или сделать меш на лету, илиgpu instanceaging of quad), предварительно вычислите расстояние в текстуру и передайте интенсивность в виде цветов, визуализируйте в текстуру (уменьшенную или нет).Бим!Используйте растеризацию для того, в чем она хороша :)

...