Changeset 1086


Ignore:
Timestamp:
Nov 25, 2011, 12:30:23 AM (9 years ago)
Author:
sam
Message:

tutorial: fix texel offset issues in the fractal zoomer.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/test/tutorial/tut03.cpp

    r1085 r1086  
    8181            m_dirty[i] = 2;
    8282        }
     83#if defined __CELLOS_LV2__ || defined __native_client__
     84        //m_center = f64cmplx(-.22815528839841, -1.11514249704382);
     85        //m_center = f64cmplx(0.001643721971153, 0.822467633298876);
     86        m_center = f64cmplx(-0.65823419062254, .50221777363480);
     87        m_zoom_speed = 0;//-0.0025;
     88#else
    8389        m_center = -0.75;
    84 #if defined __CELLOS_LV2__ || defined __native_client__
    85         m_zoom_speed = -0.0025;
    86 #else
    8790        m_zoom_speed = 0.0;
    8891#endif
     
    208211            }
    209212            m_radius *= zoom;
    210 #if defined __CELLOS_LV2__ || defined __native_client__
    211             //m_center = f64cmplx(-.22815528839841, -1.11514249704382);
    212             //m_center = f64cmplx(0.001643721971153, 0.822467633298876);
    213             m_center = f64cmplx(-0.65823419062254, .50221777363480);
    214 #else
     213#if !defined __CELLOS_LV2__ && !defined __native_client__
    215214            m_center = (m_center - worldmouse) * zoom + worldmouse;
    216215            worldmouse = m_center + ScreenToWorldOffset(mousepos);
     
    370369                "attribute vec2 in_TexCoord;"
    371370                "attribute vec2 in_Vertex;"
    372                 "void main(void) {"
     371                "void main(void)"
     372                "{"
    373373                "    gl_Position = vec4(in_Vertex, 0.0, 1.0);"
    374374#if defined HAVE_GLES_2X
     
    392392                "uniform sampler2D in_Texture;"
    393393                ""
    394                 "float mylen(vec2 p) {"
    395                 //"    return abs(p.x) + abs(p.y);"
    396                 "    return 0.001 + p.x * p.x + p.y * p.y;"
    397                 //"    return 0.001 + length(p);"
     394                "float mylen(vec2 p)"
     395                "{"
     396                "    p *= in_TexelSize.zw;" /* Correct for aspect ratio */
     397                //"    return 0.001 + abs(p.x) + abs(p.y);"
     398                //"    return 0.1 + length(p);"
     399                "    vec2 q = p * p;"
     400                "    return 0.01 + q.x + q.y;"
    398401                "}"
    399402                ""
     
    402405                 * p is in normalised [0,1] texture coordinates.
    403406                 * return value has the 0.25 Y scaling. */
    404                 "vec3 nearest0(vec2 p) {"
     407                "vec3 nearest0(vec2 p)"
     408                "{"
     409                     /* Step 1: center point in [-.5,.5], apply zoom and
     410                      * translation transformation, and go back to texture
     411                      * coordinates in [0,1]. That's the ideal point we
     412                      * would like to compute the value for. */
    405413                "    p -= vec2(0.5, 0.5);"
    406414                "    p *= in_ZoomSettings[0][2];"
    407415                "    p += vec2(in_ZoomSettings[0][0], -in_ZoomSettings[0][1]);"
    408416                "    p += vec2(0.5, 0.5);"
    409                 "    vec2 q = p + 0.5 * in_TexelSize.xy;"
     417                     /* Step 2: find out the (rounded) texel coordinates in
     418                      * the half-resolution slice. We use an offset of 15/32
     419                      * instead of 1/2 to avoid rounding issues at edges. */
     420                "    vec2 q = p + 0.46875 * in_TexelSize.xy;"
    410421                "    q = in_TexelSize.xy"
    411422                "         * (1.0 + 2.0 * floor(q * 0.5 * in_TexelSize.zw));"
     423                     /* Step 3: go back to full-resolution texel coordinates
     424                      * so that we know the error between the pixel we get
     425                      * and the pixel we wanted. */
    412426                "    vec2 r = q - 0.5 * in_TexelSize.xy;"
    413                 "    float l = (abs(q.x - 0.5) < 0.5 && abs(q.y - 0.5) < 0.5)"
     427                "    float l = (abs(q.x - .5) < .5 && abs(q.y - .5) < .5)"
    414428                "             ? 1.0 / mylen(r - p) : 0.0;"
     429                     /* Step 4: return final texel coordinates and
     430                      * corresponding error value. */
    415431                "    return vec3(q * vec2(1.0, 0.25), l);"
    416432                "}"
    417433                ""
    418                 "vec3 nearest1(vec2 p) {"
     434                "vec3 nearest1(vec2 p)"
     435                "{"
    419436                "    p -= vec2(0.5, 0.5);"
    420437                "    p *= in_ZoomSettings[1][2];"
    421438                "    p += vec2(in_ZoomSettings[1][0], -in_ZoomSettings[1][1]);"
    422439                "    p += vec2(0.5, 0.5);"
    423                 "    vec2 q = p + -0.5 * in_TexelSize.xy;"
     440                "    vec2 q = p + -0.46875 * in_TexelSize.xy;"
    424441                "    q = in_TexelSize.xy"
    425442                "         * (1.0 + 2.0 * floor(q * 0.5 * in_TexelSize.zw));"
    426443                "    vec2 r = q - -0.5 * in_TexelSize.xy;"
    427                 "    float l = (abs(q.x - 0.5) < 0.5 && abs(q.y - 0.5) < 0.5)"
     444                "    float l = (abs(q.x - .5) < .5 && abs(q.y - .5) < .5)"
    428445                "             ? 1.0 / mylen(r - p) : 0.0;"
    429446                "    return vec3(q * vec2(1.0, 0.25) + vec2(0.0, 0.25), l);"
    430447                "}"
    431448                ""
    432                 "vec3 nearest2(vec2 p) {"
     449                "vec3 nearest2(vec2 p)"
     450                "{"
    433451                "    p -= vec2(0.5, 0.5);"
    434452                "    p *= in_ZoomSettings[2][2];"
    435453                "    p += vec2(in_ZoomSettings[2][0], -in_ZoomSettings[2][1]);"
    436454                "    p += vec2(0.5, 0.5);"
    437                 "    vec2 q = p + vec2(0.5, -0.5) * in_TexelSize.xy;"
     455                "    vec2 q = p + vec2(0.46875, -0.46875) * in_TexelSize.xy;"
    438456                "    q = in_TexelSize.xy"
    439457                "         * (1.0 + 2.0 * floor(q * 0.5 * in_TexelSize.zw));"
    440458                "    vec2 r = q - vec2(0.5, -0.5) * in_TexelSize.xy;"
    441                 "    float l = (abs(q.x - 0.5) < 0.5 && abs(q.y - 0.5) < 0.5)"
     459                "    float l = (abs(q.x - .5) < .5 && abs(q.y - .5) < .5)"
    442460                "             ? 1.0 / mylen(r - p) : 0.0;"
    443461                "    return vec3(q * vec2(1.0, 0.25) + vec2(0.0, 0.50), l);"
    444462                "}"
    445463                ""
    446                 "vec3 nearest3(vec2 p) {"
     464                "vec3 nearest3(vec2 p)"
     465                "{"
    447466                "    p -= vec2(0.5, 0.5);"
    448467                "    p *= in_ZoomSettings[3][2];"
    449468                "    p += vec2(in_ZoomSettings[3][0], -in_ZoomSettings[3][1]);"
    450469                "    p += vec2(0.5, 0.5);"
    451                 "    vec2 q = p + vec2(-0.5, 0.5) * in_TexelSize.xy;"
     470                "    vec2 q = p + vec2(-0.46875, 0.46875) * in_TexelSize.xy;"
    452471                "    q = in_TexelSize.xy"
    453472                "         * (1.0 + 2.0 * floor(q * 0.5 * in_TexelSize.zw));"
    454473                "    vec2 r = q - vec2(-0.5, 0.5) * in_TexelSize.xy;"
    455                 "    float l = (abs(q.x - 0.5) < 0.5 && abs(q.y - 0.5) < 0.5)"
     474                "    float l = (abs(q.x - .5) < .5 && abs(q.y - .5) < .5)"
    456475                "             ? 1.0 / mylen(r - p) : 0.0;"
    457476                "    return vec3(q * vec2(1.0, 0.25) + vec2(0.0, 0.75), l);"
    458477                "}"
    459478                ""
    460                 "void main(void) {"
     479                "void main(void)"
     480                "{"
    461481#if defined HAVE_GLES_2X
    462482                "    vec2 coord = pass_TexCoord;"
     
    473493                "    vec4 p2 = texture2D(in_Texture, k2.xy);"
    474494                "    vec4 p3 = texture2D(in_Texture, k3.xy);"
    475 //"if (k0.z >= k1.z && k0.z >= k2.z && k0.z >= k3.z) gl_FragColor = p0;"
    476 //"if (k1.z >= k0.z && k1.z >= k2.z && k1.z >= k3.z) gl_FragColor = p1;"
    477 //"if (k2.z >= k0.z && k2.z >= k1.z && k2.z >= k3.z) gl_FragColor = p2;"
    478 //"if (k3.z >= k0.z && k3.z >= k1.z && k3.z >= k2.z) gl_FragColor = p3;"
    479                 "    gl_FragColor = 1.0 / (k0.z + k1.z + k2.z + k3.z)"
    480                 "          * (k0.z * p0 + k1.z * p1 + k2.z * p2 + k3.z * p3);"
     495"if (k0.z >= k1.z && k0.z >= k2.z && k0.z >= k3.z) gl_FragColor = p0;"
     496"if (k1.z >= k0.z && k1.z >= k2.z && k1.z >= k3.z) gl_FragColor = p1;"
     497"if (k2.z >= k0.z && k2.z >= k1.z && k2.z >= k3.z) gl_FragColor = p2;"
     498"if (k3.z >= k0.z && k3.z >= k1.z && k3.z >= k2.z) gl_FragColor = p3;"
     499//                "    gl_FragColor = 1.0 / (k0.z + k1.z + k2.z + k3.z)"
     500//                "          * (k0.z * p0 + k1.z * p1 + k2.z * p2 + k3.z * p3);"
    481501                "}"
    482502#else
     
    490510                "}",
    491511
    492                 "float3 nearest0(float2 p, float4 in_TexelSize) {"
     512                "float3 nearest0(float2 p, float4 in_TexelSize)"
     513                "{"
    493514                "    float2 q = p + 0.5 * in_TexelSize.xy;"
    494515                "    q -= fmod(q, 2.0 * in_TexelSize.xy);"
     
    498519                "}"
    499520                ""
    500                 "float3 nearest1(float2 p, float4 in_TexelSize) {"
     521                "float3 nearest1(float2 p, float4 in_TexelSize)"
     522                "{"
    501523                "    float2 q = p - 0.5 * in_TexelSize.xy;"
    502524                "    q -= fmod(q, 2.0 * in_TexelSize.xy);"
     
    506528                "}"
    507529                ""
    508                 "float3 nearest2(float2 p, float4 in_TexelSize) {"
     530                "float3 nearest2(float2 p, float4 in_TexelSize)"
     531                "{"
    509532                "    float2 q = p + float2(0.5, -0.5) * in_TexelSize.xy;"
    510533                "    q -= fmod(q, 2.0 * in_TexelSize.xy);"
     
    514537                "}"
    515538                ""
    516                 "float3 nearest3(float2 p, float4 in_TexelSize) {"
     539                "float3 nearest3(float2 p, float4 in_TexelSize)"
     540                "{"
    517541                "    float2 q = p + float2(-0.5, 0.5) * in_TexelSize.xy;"
    518542                "    q -= fmod(q, 2.0 * in_TexelSize.xy);"
Note: See TracChangeset for help on using the changeset viewer.