Changeset 1842


Ignore:
Timestamp:
Aug 30, 2012, 11:52:03 PM (11 years ago)
Author:
sam
Message:

tutorial: make the noise shader computationally more efficient.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tutorial/03_noise.lolfx

    r1840 r1842  
    1616uniform float u_Time;
    1717
    18 vec3 mod289(vec3 x)
     18vec4 mod289(vec4 x)
    1919{
    2020    return x - floor(x * (1.0 / 289.0)) * 289.0;
    2121}
    2222
    23 vec3 perm(vec3 x)
     23vec4 perm(vec4 x)
    2424{
    2525    return mod289(((x * 34.0) + 1.0) * x);
    2626}
    2727
    28 vec4 noise3d(vec3 p1, vec3 p2, vec3 p3, vec3 p4)
    29 {
    30     p1 = perm(perm(perm(p1) + p1.zxy) + p1.yzx);
    31     p2 = perm(perm(perm(p2) + p2.zxy) + p2.yzx);
    32     p3 = perm(perm(perm(p3) + p3.zxy) + p3.yzx);
    33     p4 = perm(perm(perm(p4) + p4.zxy) + p4.yzx);
    34     return fract(vec4(p1.x, p2.x, p3.x, p4.x) / 41.0);
    35 }
    36 
    37 float perlin3d(vec3 p)
     28float noise3d(vec3 p)
    3829{
    3930    mat3 r = mat3(0.36, 0.48, -0.8, -0.8, 0.60, 0.0, 0.48, 0.64, 0.60);
     
    4435    d = d * d * (3.0 - 2.0 * d);
    4536
    46     vec4 o1 = noise3d(a,
    47                       a + vec3(0.0, 1.0, 0.0),
    48                       a + vec3(0.0, 0.0, 1.0),
    49                       a + vec3(0.0, 1.0, 1.0));
    50     vec4 o2 = noise3d(a + vec3(1.0, 0.0, 0.0),
    51                       a + vec3(1.0, 1.0, 0.0),
    52                       a + vec3(1.0, 0.0, 1.0),
    53                       a + vec3(1.0, 1.0, 1.0));
     37    vec4 b = a.xxyy + vec4(0.0, 1.0, 0.0, 1.0);
     38    vec4 k1 = perm(b.xyxy);
     39    vec4 k2 = perm(k1.xyxy + b.zzww);
    5440
    55     vec4 o3 = o2 * d.x + o1 * (1.0 - d.x);
    56     vec2 o4 = o3.yw * d.y + o3.xz * (1.0 - d.y);
     41    vec4 c = k2 + a.zzzz;
     42    vec4 k3 = perm(c);
     43    vec4 k4 = perm(c + 1.0);
    5744
    58     return o4.y * d.z + o4.x * (1.0 - d.z);
     45    vec4 o1 = fract(k3 * (1.0 / 41.0));
     46    vec4 o2 = fract(k4 * (1.0 / 41.0));
     47
     48    vec4 o3 = o2 * d.z + o1 * (1.0 - d.z);
     49    vec2 o4 = o3.yw * d.x + o3.xz * (1.0 - d.x);
     50
     51    return o4.y * d.y + o4.x * (1.0 - d.y);
    5952}
    6053
     
    6558    float z = u_Time * 2.0;
    6659
    67     float p = perlin3d(vec3(xy / 80.0, z + 1.5)) / 2.0
    68             + perlin3d(vec3(xy / 40.0, z + 0.3)) / 4.0
    69             + perlin3d(vec3(xy / 20.0, z + 3.3)) / 8.0
    70             + perlin3d(vec3(xy / 10.0, z + 2.0)) / 16.0;
     60    float p = noise3d(vec3(xy / 80.0, z)) / 2.0
     61            + noise3d(vec3(xy / 40.0, z)) / 4.0
     62            + noise3d(vec3(xy / 20.0, z)) / 8.0
     63            + noise3d(vec3(xy / 10.0, z)) / 16.0;
    7164
    7265    /* Scroll by adding [-.5,.5] */
     
    9790-- HLSL.Frag --
    9891
    99 float3 mod289(float3 x)
     92float4 mod289(float4 x)
    10093{
    10194    return x - floor(x * (1.0 / 289.0)) * 289.0;
    10295}
    10396
    104 float3 perm(float3 x)
     97float4 perm(float4 x)
    10598{
    10699    return mod289(((x * 34.0) + 1.0) * x);
    107100}
    108101
    109 float4 noise3d(float3 p1, float3 p2, float3 p3, float3 p4)
    110 {
    111     p1 = perm(perm(perm(p1) + p1.zxy) + p1.yzx);
    112     p2 = perm(perm(perm(p2) + p2.zxy) + p2.yzx);
    113     p3 = perm(perm(perm(p3) + p3.zxy) + p3.yzx);
    114     p4 = perm(perm(perm(p4) + p4.zxy) + p4.yzx);
    115     return frac(float4(p1.x, p2.x, p3.x, p4.x) / 41.0);
    116 }
    117 
    118 float perlin3d(float3 p)
     102float noise3d(float3 p)
    119103{
    120104    float3x3 r = float3x3(0.36, 0.48, -0.8, -0.8, 0.60, 0.0, 0.48, 0.64, 0.60);
     
    125109    d = d * d * (3.0 - 2.0 * d);
    126110
    127     float4 o1 = noise3d(a,
    128                         a + float3(0.0, 1.0, 0.0),
    129                         a + float3(0.0, 0.0, 1.0),
    130                         a + float3(0.0, 1.0, 1.0));
    131     float4 o2 = noise3d(a + float3(1.0, 0.0, 0.0),
    132                         a + float3(1.0, 1.0, 0.0),
    133                         a + float3(1.0, 0.0, 1.0),
    134                         a + float3(1.0, 1.0, 1.0));
     111    float4 b = a.xxyy + float4(0.0, 1.0, 0.0, 1.0);
     112    float4 k1 = perm(b.xyxy);
     113    float4 k2 = perm(k1.xyxy + b.zzww);
    135114
    136     float4 o3 = o2 * d.x + o1 * (1.0 - d.x);
    137     float2 o4 = o3.yw * d.y + o3.xz * (1.0 - d.y);
     115    float4 c = k2 + a.zzzz;
     116    float4 k3 = perm(c);
     117    float4 k4 = perm(c + 1.0);
    138118
    139     return o4.y * d.z + o4.x * (1.0 - d.z);
     119    float4 o1 = frac(k3 * (1.0 / 41.0));
     120    float4 o2 = frac(k4 * (1.0 / 41.0));
     121
     122    float4 o3 = o2 * d.z + o1 * (1.0 - d.z);
     123    float2 o4 = o3.yw * d.x + o3.xz * (1.0 - d.x);
     124
     125    return o4.y * d.y + o4.x * (1.0 - d.y);
    140126}
    141127
     
    148134    float z = u_Time * 2.0;
    149135
    150     float p = perlin3d(float3(xy / 80.0, z + 1.5)) / 2.0
    151             + perlin3d(float3(xy / 40.0, z + 0.3)) / 4.0
    152             + perlin3d(float3(xy / 20.0, z + 3.3)) / 8.0
    153             + perlin3d(float3(xy / 10.0, z + 2.0)) / 16.0;
     136    float p = noise3d(float3(xy / 80.0, z)) / 2.0
     137            + noise3d(float3(xy / 40.0, z)) / 4.0
     138            + noise3d(float3(xy / 20.0, z)) / 8.0
     139            + noise3d(float3(xy / 10.0, z)) / 16.0;
    154140
    155141    /* Scroll by adding [-.5,.5] */
Note: See TracChangeset for help on using the changeset viewer.