Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  gskgputurbulence.glsl   Sprache: unbekannt

 
Spracherkennung für: .glsl vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]

#ifdef GSK_PREAMBLE
textures = 1;
acs_equals_ccs = false;
acs_premultiplied = true;

graphene_rect_t bounds;
graphene_size_t base_frequency;
guint32 num_octaves;
float tile_x;
float tile_y;
float tile_width;
float tile_height;

variation: gboolean fractal_noise;
variation: gboolean stitch_tiles;
#endif /* GSK_PREAMBLE */

#include "gskgputurbulenceinstance.glsl"

PASS(0) vec2 _pos;
PASS_FLAT(1) Rect _bounds;
PASS_FLAT(2) vec2 _base_frequency;
PASS_FLAT(3) uint _num_octaves;
PASS_FLAT(4) float _tile_x;
PASS_FLAT(5) float _tile_y;
PASS_FLAT(6) float _tile_width;
PASS_FLAT(7) float _tile_height;


#ifdef GSK_VERTEX_SHADER

void
run (out vec2 pos)
{
  Rect b = rect_from_gsk (in_bounds);

  pos = rect_get_position (b);

  _pos = pos;
  _bounds = b;
  _base_frequency = in_base_frequency;
  _num_octaves = in_num_octaves;
  _tile_x = in_tile_x;
  _tile_y = in_tile_y;
  _tile_width = in_tile_width;
  _tile_height = in_tile_height;
}

#endif



#ifdef GSK_FRAGMENT_SHADER

#define BSize 0x100
#define BM 0xff
#define PerlinN 0x1000

int
get_lattice (int idx)
{
  return int (texelFetch (GSK_TEXTURE0, ivec2 (idx, 0), 0).a);
}

vec2
get_gradient (int channel, int idx)
{
  return texelFetch (GSK_TEXTURE0, ivec2 (idx, channel), 0).rg;
}

float
s_curve (float t)
{
  return t * t * (3.0 - 2.0 * t);
}

vec4
noise2 (vec2 pos, int stitch_width, int stitch_height, int stitch_wrap_x, int stitch_wrap_y)
{
  int bx0, bx1, by0, by1, b00, b10, b01, b11;
  float rx0, rx1, ry0, ry1, sx, sy, a, b, u, v;
  int i, j;
  vec2 q;
  vec4 res;

  float fx = pos.x + float(PerlinN);
  bx0 = int (fx);
  bx1 = bx0 + 1;
  rx0 = fx - floor (fx);
  rx1 = rx0 - 1.0;

  float fy = pos.y + float(PerlinN);
  by0 = int (fy);
  by1 = by0 + 1;
  ry0 = fy - floor (fy);
  ry1 = ry0 - 1.0;

  if (VARIATION_STITCH_TILES)
    {
      if (bx0 >= stitch_wrap_x)
        bx0 -= stitch_width;
      if (bx1 >= stitch_wrap_x)
        bx1 -= stitch_width;
      if (by0 >= stitch_wrap_y)
        by0 -= stitch_height;
      if (by1 >= stitch_wrap_y)
        by1 -= stitch_height;
    }

  bx0 &= BM;
  bx1 &= BM;
  by0 &= BM;
  by1 &= BM;

  i = get_lattice (bx0);
  j = get_lattice (bx1);
  b00 = get_lattice (i + by0);
  b10 = get_lattice (j + by0);
  b01 = get_lattice (i + by1);
  b11 = get_lattice (j + by1);

  sx = s_curve (rx0);
  sy = s_curve (ry0);

  for (int channel = 0; channel < 4; channel++)
    {
      q = get_gradient (channel, b00);
      u = rx0 * q.x + ry0 * q.y;
      q = get_gradient (channel, b10);
      v = rx1 * q.x + ry0 * q.y;
      a = mix (u, v, sx);
      q = get_gradient (channel, b01);
      u = rx0 * q.x + ry1 * q.y;
      q = get_gradient (channel, b11);
      v = rx1 * q.x + ry1 * q.y;
      b = mix (u, v, sx);

      res[channel] = mix (a, b, sy);
    }

  return res;
}

vec4
turbulence (vec2 point, vec2 base_freq, uint n_octaves)
{
  int stitch_width = 0, stitch_height = 0, strich_wrap_x = 0, stitch_wrap_y = 0;

  if (VARIATION_STITCH_TILES)
    {
      if (base_freq.x != 0.0)
        {
          float freq_low = floor (_tile_width * base_freq.x) / _tile_width;
          float freq_high = ceil (_tile_width * base_freq.x) / _tile_width;
          if (base_freq.x / freq_low < freq_high / base_freq.x)
            base_freq.x = freq_low;
          else
            base_freq.x = freq_high;
        }
      if (base_freq.y != 0.0)
        {
          float freq_low = floor (_tile_height * base_freq.y) / _tile_height;
          float freq_high = ceil (_tile_height * base_freq.y) / _tile_height;
          if (base_freq.y / freq_low < freq_high / base_freq.y)
            base_freq.y = freq_low;
          else
            base_freq.y = freq_high;
        }
      stitch_width = int (_tile_width * base_freq.x + 0.5);
      strich_wrap_x = PerlinN + stitch_width;
      stitch_height = int (_tile_height * base_freq.y + 0.5);
      stitch_wrap_y = PerlinN + stitch_height;
    }

  vec4 sum = vec4(0.00.00.00.0);
  vec2 v = point * base_freq;
  float ratio = 1.0;

  for (uint octave = 0u; octave < n_octaves; octave++)
    {
      vec4 n = noise2 (v, stitch_width, stitch_height, strich_wrap_x, stitch_wrap_y);
      if (VARIATION_FRACTAL_NOISE)
        sum += n / ratio;
      else
        sum += abs (n) / ratio;
      v *= 2.0;
      ratio *= 2.0;
      if (VARIATION_STITCH_TILES)
        {
          stitch_width *= 2;
          strich_wrap_x = 2 * strich_wrap_x - PerlinN;
          stitch_height *= 2;
          stitch_wrap_y = 2 * stitch_wrap_y - PerlinN;
        }
    }

  return sum;
}

void
run (out vec4 color,
     out vec2 position)
{
  float alpha = rect_coverage (_bounds, _pos);
  /* Compute noise in node-local coordinates, not screen coordinates.
   * _pos includes the render pass offset which changes with scrolling
   * and window resizing. Subtract the quad origin to get the pixel
   * offset within the node, then add the node's own origin.
   */
  vec2 pixel_offset = (_pos - rect_bounds (_bounds).xy - 0.5 * fwidth(_pos)) / GSK_GLOBAL_SCALE;
  vec2 point = vec2 (_tile_x, _tile_y) + pixel_offset;

  vec4 n = turbulence (point, _base_frequency, _num_octaves);

  float r, g, b, a;

  if (VARIATION_FRACTAL_NOISE)
    {
      r = (n.r + 1.0) / 2.0;
      g = (n.g + 1.0) / 2.0;
      b = (n.b + 1.0) / 2.0;
      a = (n.a + 1.0) / 2.0;
    }
  else
    {
      r = n.r;
      g = n.g;
      b = n.b;
      a = n.a;
    }

  r = clamp (r, 0.01.0);
  g = clamp (g, 0.01.0);
  b = clamp (b, 0.01.0);
  a = clamp (a, 0.01.0);

  r *= a;
  g *= a;
  b *= a;

  color = vec4 (r, g, b, a);

  color = output_color_from_alt (color);
  color = output_color_alpha (color, alpha);
  position = _pos;
}

#endif

[Dauer der Verarbeitung: 0.13 Sekunden, vorverarbeitet 2026-07-02]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik