Helpers - компьютеры, интернет, программирование

openGL GLSL Shader: нарисуйте круг на плоском многоугольнике

Я ищу способ нарисовать что-то похожее на эти «ручки» с помощью шейдера GLSL.

альтернативный текст

Я хочу рисовать только цветные круги, и мое приложение не для ручки, а для причудливого индикатора прогресса. Можно ли рисовать круги (или, точнее, дуги) на плоском многоугольнике, просто используя шейдер? И как бы начать процесс?

29.11.2010

Ответы:


1

Да, это возможно ! Проверьте этот скрипт GLSL, который рисует несколько разных дуг:


#define between(v,x1,x2) (v>= x1 && v<=x2)
#define pi 3.141592653589793238462643383279

uniform sampler2D tex;

void main()
{
    vec2  pnt = vec2(0.5,0.5);
    float dr = 0.005;
    float fr = 0.15;
    float r1 = fr;
    float r2 = 1.5*fr;
    float r3 = 2.0*fr;
    float r4 = 2.5*fr;
    float r5 = 3.0*fr;
    float rp = distance(pnt,gl_TexCoord[0].xy);
    vec4 col1 = vec4(0.4,0.1,0.,1.);
    vec4 col2 = vec4(1.,1.,1.,1.);
    float angle = atan(gl_TexCoord[0].y,gl_TexCoord[0].x);
    vec4 rezcol;
    rezcol = (between(rp,r1-dr,r1+dr) && between(angle,-pi,pi))? col1:col2;
    rezcol = (between(rp,r2-dr,r2+dr) && between(angle,-pi,pi/3.1) && rezcol==col2)? col1:rezcol;
    rezcol = (between(rp,r3-dr,r3+dr) && between(angle,-pi,pi/4.6) && rezcol==col2)? col1:rezcol;
    rezcol = (between(rp,r4-dr,r4+dr) && between(angle,-pi,pi/8.8) && rezcol==col2)? col1:rezcol;
    rezcol = (between(rp,r5-dr,r5+dr) && between(angle,-pi,pi/22.8) && rezcol==col2)? col1:rezcol;
    gl_FragColor = rezcol;
}

что приводит к такому изображению:

альтернативный текст

01.12.2010
  • Я бы сказал, не самый элегантный подход из всех ;) Вы вводите одну ветвь (?:) на круг, чего, безусловно, можно избежать. Кроме того, может быть расширен с некоторым сглаживанием. (Все равно +1) 01.12.2010
  • Ойойой. Добавьте некоторый плавный шаг, чтобы обеспечить сглаживание. Кроме того, ваши круги обрезаны по касательной, они должны быть обрезаны линией, пересекающей центр круга (концы кругов должны иметь углы 90 градусов, в отличие от вашего случая, особенно самый верхний). 30.04.2013

  • 2

    Да, это возможно. Установите координаты текстуры для полигона, чтобы вы могли получить доступ к относительным координатам в шейдере (например, от -1,-1 до 1,1 делает центр полигона равным 0,0). Во фрагментном шейдере рассчитать расстояние до центра с помощью pythagoran. Если расстояние меньше радиуса круга, пиксель находится внутри круга. Затем вы можете указать радиус для двух кругов и раскрасить пиксель, если он находится внутри внешнего круга и за пределами внутреннего круга.

    Если вы хотите раскрасить только дугу, получите угол с помощью atan(y,x) и проверьте, находится ли он в заданном диапазоне.

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

    Также в качестве оптимизации вам не нужно вычислять квадратный корень при вычислении расстояния до центра, если вместо этого вы проверяете радиус ^ 2.

    29.11.2010
    Новые материалы

    Интуитивное понимание тензоров в машинном обучении
    Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

    Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
    Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

    Почему объяснимость так важна прямо сейчас?
    По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

    Анимированный математический анализ
    Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

    Создание простого слайдера изображений с помощью JavaScript
    Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

    Создание базы данных с помощью супергероя «Python»
    В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

    ИИ для чайников: руководство для начинающих по пониманию будущего технологий
    Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..