Changeset 2311 for trunk


Ignore:
Timestamp:
Feb 1, 2013, 3:48:54 PM (7 years ago)
Author:
sam
Message:

tutorial: HLSL version of the graph plotting shader.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tutorial/04_texture.lolfx

    r2197 r2311  
    7575}
    7676
     77[vert.hlsl]
     78
     79void main(float2 in_Position : POSITION,
     80          out float4 out_Position : POSITION,
     81          out float4 pass_Position : TEXCOORD0)
     82{
     83    pass_Position = float4(0.5 * in_Position + 0.5, 0.0, 1.0);
     84    out_Position = float4(in_Position, 0.5, 1.0);
     85}
     86
     87[frag.hlsl]
     88
     89float segdist(float2 p1, float2 p2, float2 a)
     90{
     91    float d = max(1e-10, dot(p2 - p1, p2 - p1));
     92    float t = clamp(dot(a - p1, p2 - p1) / d, 0.0, 1.0);
     93    return distance(a, lerp(p1, p2, t));
     94}
     95
     96void main(in float4 pass_Position : TEXCOORD0,
     97          uniform sampler2D u_Texture,
     98          out float4 out_FragColor : COLOR)
     99{
     100    float width = 800.0;
     101    float height = 600.0;
     102    float texture_width = 256.0;
     103    float line_width = 1.2;
     104    float dot_size = 1.0;
     105    float4 delta = float4(1.0 / texture_width, 0.0,
     106                          2.0 / texture_width, 0.0);
     107
     108    float2 p = pass_Position.xy;
     109    float2 tc = float2(floor(p.x * texture_width) / texture_width, p.y);
     110    float t = p.x * texture_width - floor(p.x * texture_width);
     111    float4 c;
     112    c[0] = tex2D(u_Texture, tc - delta.xy).x;
     113    c[1] = tex2D(u_Texture, tc).x;
     114    c[2] = tex2D(u_Texture, tc + delta.xy).x;
     115    c[3] = tex2D(u_Texture, tc + delta.zw).x;
     116
     117    /* Find the 4 closest points in screen space */
     118    float2 p0 = float2((tc.x - delta.x) * width, c[0] * height);
     119    float2 p1 = float2((tc.x          ) * width, c[1] * height);
     120    float2 p2 = float2((tc.x + delta.x) * width, c[2] * height);
     121    float2 p3 = float2((tc.x + delta.z) * width, c[3] * height);
     122    float2 a = float2(p.x * width, p.y * height);
     123
     124    /* Compute distance to segments */
     125    float d =        segdist(p0, p1, a);
     126          d = min(d, segdist(p1, p2, a));
     127          d = min(d, segdist(p2, p3, a));
     128
     129    /* Compute distance to dots */
     130    d = min(d, length(a - p0) - dot_size);
     131    d = min(d, length(a - p1) - dot_size);
     132    d = min(d, length(a - p2) - dot_size);
     133    d = min(d, length(a - p3) - dot_size);
     134
     135    /* Add line width */
     136    float lum = clamp(line_width - d, 0.0, 1.0);
     137
     138    /* Compensate for sRGB */
     139    lum = pow(1.0 - lum, 1.0 / 2.4);
     140
     141    /* Choose some funny colours */
     142    out_FragColor = float4(lerp(p.x, 1.0, lum), lum, lum, 1.0);
     143}
     144
Note: See TracChangeset for help on using the changeset viewer.