, если значение равно float
, и вы знаете его диапазон. Вы можете попробовать раскрасить, как описано выше, с фрагментным шейдером поверх него, который будет отображать только фрагмент очень близко к вашему отображаемому значению.
Самый простой -чтобы использовать один проход рендеринга, используйте что-то подобное во фрагменте:
float x;
x = (value/10.0)+0.5; // 10 is distance of value you want the lines to render
x = x-floor(x); // x = value mod distance
if (abs(x-0.5)>0.001) discard; // do not render fragments too far from your line
код просто решает, находитесь ли вы очень близко к каждому расстоянию = 10 от значения, и отбрасываете любые фрагменты, которые не являются таковыми.Однако толщина линий / кривых может варьироваться в зависимости от плотности значений и распределения размера треугольника.Вы должны правильно установить константы (distance=10,threshold=0.001
), чтобы сделать эту работу.
Этот Подсветка поверхности анимированной сетки GLSL использует очень похожую технику, кроме отбрасывания, поскольку материал там непрерывный.
Более точный вариант - использовать тот же принцип в 2-х проходном рендере.Где вы представляете свою ценность как цвет в некоторой текстуре в первом проходе.И затем за секунду для каждого фрагмента вы сканируете текстуру вокруг и находите ближайшую позицию отображаемого значения, а затем на основе расстояния до него либо визуализируете, либо нет.Это обеспечивает точную толщину линии, несмотря ни на что.Но для этого значение должно содержать конкретные значения рендеринга.Этот Как реализовать эффект 2D лучевого освещения в GLSL может помочь, так как он также сканирует текстуру во всех направлениях (но для разных целей).
Если ни одно из вышеперечисленного не подходит вам, тогда толькоДругой вариант, который мне приходит в голову, - это геометрический подход, при котором вы создаете полилинии из вашей сетки на основе пересечения значений с вашей сеткой (например, сечение с плоскостью).