Ver código fonte

tutorial: fix texel offset issues in the fractal zoomer.

legacy
Sam Hocevar sam 13 anos atrás
pai
commit
b7f21d3d49
1 arquivos alterados com 59 adições e 35 exclusões
  1. +59
    -35
      test/tutorial/tut03.cpp

+ 59
- 35
test/tutorial/tut03.cpp Ver arquivo

@@ -80,10 +80,13 @@ public:
m_deltascale[i] = 1.0;
m_dirty[i] = 2;
}
m_center = -0.75;
#if defined __CELLOS_LV2__ || defined __native_client__
m_zoom_speed = -0.0025;
//m_center = f64cmplx(-.22815528839841, -1.11514249704382);
//m_center = f64cmplx(0.001643721971153, 0.822467633298876);
m_center = f64cmplx(-0.65823419062254, .50221777363480);
m_zoom_speed = 0;//-0.0025;
#else
m_center = -0.75;
m_zoom_speed = 0.0;
#endif
m_radius = 5.0;
@@ -207,11 +210,7 @@ public:
zoom = 1e-14 / m_radius;
}
m_radius *= zoom;
#if defined __CELLOS_LV2__ || defined __native_client__
//m_center = f64cmplx(-.22815528839841, -1.11514249704382);
//m_center = f64cmplx(0.001643721971153, 0.822467633298876);
m_center = f64cmplx(-0.65823419062254, .50221777363480);
#else
#if !defined __CELLOS_LV2__ && !defined __native_client__
m_center = (m_center - worldmouse) * zoom + worldmouse;
worldmouse = m_center + ScreenToWorldOffset(mousepos);
#endif
@@ -369,7 +368,8 @@ public:
#endif
"attribute vec2 in_TexCoord;"
"attribute vec2 in_Vertex;"
"void main(void) {"
"void main(void)"
"{"
" gl_Position = vec4(in_Vertex, 0.0, 1.0);"
#if defined HAVE_GLES_2X
" pass_TexCoord = in_TexCoord;"
@@ -391,73 +391,93 @@ public:
"uniform mat4 in_ZoomSettings;"
"uniform sampler2D in_Texture;"
""
"float mylen(vec2 p) {"
//" return abs(p.x) + abs(p.y);"
" return 0.001 + p.x * p.x + p.y * p.y;"
//" return 0.001 + length(p);"
"float mylen(vec2 p)"
"{"
" p *= in_TexelSize.zw;" /* Correct for aspect ratio */
//" return 0.001 + abs(p.x) + abs(p.y);"
//" return 0.1 + length(p);"
" vec2 q = p * p;"
" return 0.01 + q.x + q.y;"
"}"
""
/* Get the coordinate of the nearest point in slice 0 in xy,
* and the squared distance to that point in z.
* p is in normalised [0,1] texture coordinates.
* return value has the 0.25 Y scaling. */
"vec3 nearest0(vec2 p) {"
"vec3 nearest0(vec2 p)"
"{"
/* Step 1: center point in [-.5,.5], apply zoom and
* translation transformation, and go back to texture
* coordinates in [0,1]. That's the ideal point we
* would like to compute the value for. */
" p -= vec2(0.5, 0.5);"
" p *= in_ZoomSettings[0][2];"
" p += vec2(in_ZoomSettings[0][0], -in_ZoomSettings[0][1]);"
" p += vec2(0.5, 0.5);"
" vec2 q = p + 0.5 * in_TexelSize.xy;"
/* Step 2: find out the (rounded) texel coordinates in
* the half-resolution slice. We use an offset of 15/32
* instead of 1/2 to avoid rounding issues at edges. */
" vec2 q = p + 0.46875 * in_TexelSize.xy;"
" q = in_TexelSize.xy"
" * (1.0 + 2.0 * floor(q * 0.5 * in_TexelSize.zw));"
/* Step 3: go back to full-resolution texel coordinates
* so that we know the error between the pixel we get
* and the pixel we wanted. */
" vec2 r = q - 0.5 * in_TexelSize.xy;"
" float l = (abs(q.x - 0.5) < 0.5 && abs(q.y - 0.5) < 0.5)"
" float l = (abs(q.x - .5) < .5 && abs(q.y - .5) < .5)"
" ? 1.0 / mylen(r - p) : 0.0;"
/* Step 4: return final texel coordinates and
* corresponding error value. */
" return vec3(q * vec2(1.0, 0.25), l);"
"}"
""
"vec3 nearest1(vec2 p) {"
"vec3 nearest1(vec2 p)"
"{"
" p -= vec2(0.5, 0.5);"
" p *= in_ZoomSettings[1][2];"
" p += vec2(in_ZoomSettings[1][0], -in_ZoomSettings[1][1]);"
" p += vec2(0.5, 0.5);"
" vec2 q = p + -0.5 * in_TexelSize.xy;"
" vec2 q = p + -0.46875 * in_TexelSize.xy;"
" q = in_TexelSize.xy"
" * (1.0 + 2.0 * floor(q * 0.5 * in_TexelSize.zw));"
" vec2 r = q - -0.5 * in_TexelSize.xy;"
" float l = (abs(q.x - 0.5) < 0.5 && abs(q.y - 0.5) < 0.5)"
" float l = (abs(q.x - .5) < .5 && abs(q.y - .5) < .5)"
" ? 1.0 / mylen(r - p) : 0.0;"
" return vec3(q * vec2(1.0, 0.25) + vec2(0.0, 0.25), l);"
"}"
""
"vec3 nearest2(vec2 p) {"
"vec3 nearest2(vec2 p)"
"{"
" p -= vec2(0.5, 0.5);"
" p *= in_ZoomSettings[2][2];"
" p += vec2(in_ZoomSettings[2][0], -in_ZoomSettings[2][1]);"
" p += vec2(0.5, 0.5);"
" vec2 q = p + vec2(0.5, -0.5) * in_TexelSize.xy;"
" vec2 q = p + vec2(0.46875, -0.46875) * in_TexelSize.xy;"
" q = in_TexelSize.xy"
" * (1.0 + 2.0 * floor(q * 0.5 * in_TexelSize.zw));"
" vec2 r = q - vec2(0.5, -0.5) * in_TexelSize.xy;"
" float l = (abs(q.x - 0.5) < 0.5 && abs(q.y - 0.5) < 0.5)"
" float l = (abs(q.x - .5) < .5 && abs(q.y - .5) < .5)"
" ? 1.0 / mylen(r - p) : 0.0;"
" return vec3(q * vec2(1.0, 0.25) + vec2(0.0, 0.50), l);"
"}"
""
"vec3 nearest3(vec2 p) {"
"vec3 nearest3(vec2 p)"
"{"
" p -= vec2(0.5, 0.5);"
" p *= in_ZoomSettings[3][2];"
" p += vec2(in_ZoomSettings[3][0], -in_ZoomSettings[3][1]);"
" p += vec2(0.5, 0.5);"
" vec2 q = p + vec2(-0.5, 0.5) * in_TexelSize.xy;"
" vec2 q = p + vec2(-0.46875, 0.46875) * in_TexelSize.xy;"
" q = in_TexelSize.xy"
" * (1.0 + 2.0 * floor(q * 0.5 * in_TexelSize.zw));"
" vec2 r = q - vec2(-0.5, 0.5) * in_TexelSize.xy;"
" float l = (abs(q.x - 0.5) < 0.5 && abs(q.y - 0.5) < 0.5)"
" float l = (abs(q.x - .5) < .5 && abs(q.y - .5) < .5)"
" ? 1.0 / mylen(r - p) : 0.0;"
" return vec3(q * vec2(1.0, 0.25) + vec2(0.0, 0.75), l);"
"}"
""
"void main(void) {"
"void main(void)"
"{"
#if defined HAVE_GLES_2X
" vec2 coord = pass_TexCoord;"
#else
@@ -472,12 +492,12 @@ public:
" vec4 p1 = texture2D(in_Texture, k1.xy);"
" vec4 p2 = texture2D(in_Texture, k2.xy);"
" vec4 p3 = texture2D(in_Texture, k3.xy);"
//"if (k0.z >= k1.z && k0.z >= k2.z && k0.z >= k3.z) gl_FragColor = p0;"
//"if (k1.z >= k0.z && k1.z >= k2.z && k1.z >= k3.z) gl_FragColor = p1;"
//"if (k2.z >= k0.z && k2.z >= k1.z && k2.z >= k3.z) gl_FragColor = p2;"
//"if (k3.z >= k0.z && k3.z >= k1.z && k3.z >= k2.z) gl_FragColor = p3;"
" gl_FragColor = 1.0 / (k0.z + k1.z + k2.z + k3.z)"
" * (k0.z * p0 + k1.z * p1 + k2.z * p2 + k3.z * p3);"
"if (k0.z >= k1.z && k0.z >= k2.z && k0.z >= k3.z) gl_FragColor = p0;"
"if (k1.z >= k0.z && k1.z >= k2.z && k1.z >= k3.z) gl_FragColor = p1;"
"if (k2.z >= k0.z && k2.z >= k1.z && k2.z >= k3.z) gl_FragColor = p2;"
"if (k3.z >= k0.z && k3.z >= k1.z && k3.z >= k2.z) gl_FragColor = p3;"
// " gl_FragColor = 1.0 / (k0.z + k1.z + k2.z + k3.z)"
// " * (k0.z * p0 + k1.z * p1 + k2.z * p2 + k3.z * p3);"
"}"
#else
"void main(float4 in_Position : POSITION,"
@@ -489,7 +509,8 @@ public:
" out_Position = in_Position;"
"}",

"float3 nearest0(float2 p, float4 in_TexelSize) {"
"float3 nearest0(float2 p, float4 in_TexelSize)"
"{"
" float2 q = p + 0.5 * in_TexelSize.xy;"
" q -= fmod(q, 2.0 * in_TexelSize.xy);"
" q += 0.5 * in_TexelSize.xy;"
@@ -497,7 +518,8 @@ public:
" length(q - p));"
"}"
""
"float3 nearest1(float2 p, float4 in_TexelSize) {"
"float3 nearest1(float2 p, float4 in_TexelSize)"
"{"
" float2 q = p - 0.5 * in_TexelSize.xy;"
" q -= fmod(q, 2.0 * in_TexelSize.xy);"
" q += 1.5 * in_TexelSize.xy;"
@@ -505,7 +527,8 @@ public:
" length(q - p));"
"}"
""
"float3 nearest2(float2 p, float4 in_TexelSize) {"
"float3 nearest2(float2 p, float4 in_TexelSize)"
"{"
" float2 q = p + float2(0.5, -0.5) * in_TexelSize.xy;"
" q -= fmod(q, 2.0 * in_TexelSize.xy);"
" q += float2(0.5, 1.5) * in_TexelSize.xy;"
@@ -513,7 +536,8 @@ public:
" length(q - p));"
"}"
""
"float3 nearest3(float2 p, float4 in_TexelSize) {"
"float3 nearest3(float2 p, float4 in_TexelSize)"
"{"
" float2 q = p + float2(-0.5, 0.5) * in_TexelSize.xy;"
" q -= fmod(q, 2.0 * in_TexelSize.xy);"
" q += float2(1.5, 0.5) * in_TexelSize.xy;"


Carregando…
Cancelar
Salvar