Плоттер параметрических кривых GLSL

Я пытаюсь реализовать параметрический плоттер кривых на фрагментном шейдере в GLSL.

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

Вы можете найти (рабочий и прокомментированный) код здесь.

Вот мои вопросы:

  • Я хотел бы построить его с помощью линии. Из того, что я понял, я вижу два разных способа сделать это:

    1. вычисляя расстояние между каждым пикселем и вычисленной позицией внутри цикла, накапливая вычисленное значение в переменной с плавающей запятой, а затем рисуя кривую с помощью ступенчатой ​​функции.

      Я попытался сделать это, и кажется, что я вычисляю расстояние только для одной позиции t:

      #define PI 3.14
      
      void mainImage( out vec4 fragColor, in vec2 fragCoord )
      {
          vec2 uv = -1. + 2.*fragCoord.xy / iResolution.xy;
          uv.x *= iResolution.x/iResolution.y;
          vec3 color = vec3(0.);
          vec2 pos;
          float dist;
      
          for(float t=-2.; t<2.02; t+=.02){
      
              pos.x = sin(4.*t+(iGlobalTime));
              pos.y = cos(6.*t);
      
              dist += 1.-sqrt(pow((uv.x-pos.x),2.)+pow((uv.y-pos.y),2.));
      
              color += vec3(dist);
      
      
          }//for
      
          fragColor = mix(vec4(0.0), vec4(1.0), dist);
      
      }
      
    2. Нарисовав сегмент линии между каждыми последовательными позициями параметра

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

  • Есть ли способ сделать такую ​​функцию без цикла for, управляющего параметром?

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


person apazat    schedule 05.04.2017    source источник
comment
взгляните на Нарисовать квадратичную кривую на графическом процессоре   -  person Spektre    schedule 07.04.2017
comment
Либо оцените кривую на ЦП, либо в вычислительном шейдере, а затем используйте шейдеры вершин и фрагментов, чтобы нарисовать ее. Ваш текущий подход выполняет массу избыточной работы, что противоречит цели использования графического процессора.   -  person 3Dave    schedule 04.09.2019