Changeset 1062


Ignore:
Timestamp:
Nov 12, 2011, 1:15:41 PM (11 years ago)
Author:
sam
Message:

tutorial: speed up texture uploads in the Mandelbrot viewer by only
sending the part we just modified.

File:
1 edited

Legend:

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

    r1061 r1062  
    3838        m_size = size;
    3939        m_pixels = new u8vec4[size.x * size.y];
    40         m_frame = 0;
     40        m_frame = -1;
    4141        m_center = 0;
    42         m_target = f64cmplx(0.001643721971153, 0.822467633298876);
     42        //m_target = f64cmplx(0.001643721971153, 0.822467633298876);
     43        m_target = f64cmplx(-1.207205434596, 0.315432814901);
     44        //m_target = f64cmplx(-0.79192956889854, -0.14632423080102);
     45        //m_target = f64cmplx(0.3245046418497685, 0.04855101129280834);
    4346        //m_target = f64cmplx(0.28693186889504513, 0.014286693904085048);
     47        m_angle = 0.0;
    4448        m_radius = 8.0;
    4549        m_ready = false;
     
    5761        m_frame = (m_frame + 1) % 4;
    5862
    59         double zoom = pow(2.0, -deltams * 0.00015);
     63        double zoom = pow(2.0, -deltams * 0.0005);
    6064        m_radius *= zoom;
    6165        m_center = (m_center - m_target) * zoom * zoom + m_target;
    6266
    6367        double step = m_radius / (m_size.x > m_size.y ? m_size.x : m_size.y);
    64 
    65         for (int j = m_frame / 2; j < m_size.y; j += 2)
    66         //for (int j = ((m_frame + 1) % 4) / 2; j < m_size.y; j += 2)
     68//        m_angle -= deltams * 0.00015;
     69        f64cmplx transform = step * f64cmplx(cos(m_angle), sin(m_angle));
     70
     71        u8vec4 *m_pixelstart = m_pixels + m_size.x * m_size.y / 4 * m_frame;
     72
     73        for (int j = ((m_frame + 1) % 4) / 2; j < m_size.y; j += 2)
    6774        for (int i = m_frame % 2; i < m_size.x; i += 2)
    6875        {
     
    7279            f64cmplx delta(i - m_size.x / 2, j - m_size.y / 2);
    7380
    74             f64cmplx z0 = m_center + step * delta;
     81            f64cmplx z0 = m_center + transform * delta;
    7582            f64cmplx r0 = z0;
    7683            //f64cmplx r0(0.28693186889504513, 0.014286693904085048);
     
    99106                uint8_t green = g * 255.0f;
    100107                uint8_t blue = b * 255.0f;
    101                 m_pixels[j * m_size.x + i] = u8vec4(red, green, blue, 0);
     108                *m_pixelstart++ = u8vec4(red, green, blue, 0);
    102109            }
    103110            else
    104111            {
    105                 m_pixels[j * m_size.x + i] = u8vec4(0, 0, 0, 0);
     112                *m_pixelstart++ = u8vec4(0, 0, 0, 0);
    106113            }
    107114        }
     
    134141        if (!m_ready)
    135142        {
     143            /* Create a texture of half the width and twice the height
     144             * so that we can upload four different subimages each frame. */
    136145            glGenTextures(1, &m_texid);
    137146            glBindTexture(GL_TEXTURE_2D, m_texid);
    138             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_size.x, m_size.y, 0,
    139                          GL_RGBA, GL_UNSIGNED_BYTE, m_pixels);
     147            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_size.x / 2, m_size.y * 2,
     148                         0, GL_RGBA, GL_UNSIGNED_BYTE, m_pixels);
    140149            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    141150            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
     
    155164                "void main(void) {"
    156165                "    vec2 coord = gl_TexCoord[0].xy;"
    157                 "    gl_FragColor = texture2D(in_Texture, coord);"
     166                /* gl_FragCoord is centered inside the pixel, so we remove
     167                 * 0.5 from gl_FragCoord.x. Also, (0,0) is at the bottom
     168                 * left whereas our images have (0,0) at the top left, so we
     169                 * _add_ 0.5 to gl_FragCoord.y. */
     170                "    float i = mod(gl_FragCoord.x - 0.5, 2.0);"
     171                "    float j = mod(gl_FragCoord.y + 0.5 + i, 2.0);"
     172                "    coord.y += i + j * 2;"
     173                "    coord.y *= 0.25;"
     174                "    vec4 p = texture2D(in_Texture, coord);"
     175                "    gl_FragColor = p;"
    158176                "}"
    159177#else
     
    199217        glEnable(GL_TEXTURE_2D);
    200218        glBindTexture(GL_TEXTURE_2D, m_texid);
    201         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_size.x, m_size.y,
     219        glTexSubImage2D(GL_TEXTURE_2D, 0,
     220                        0, m_frame * m_size.y / 2, m_size.x / 2, m_size.y / 2,
    202221#if !defined __CELLOS_LV2__
    203222                        GL_RGBA, GL_UNSIGNED_BYTE,
     
    206225                        GL_RGBA, GL_UNSIGNED_INT_8_8_8_8,
    207226#endif
    208                         m_pixels);
     227                        m_pixels + m_size.x * m_size.y / 4 * m_frame);
    209228
    210229        m_shader->Bind();
     
    258277
    259278    f64cmplx m_center, m_target;
    260     double m_radius;
     279    double m_radius, m_angle;
    261280};
    262281
     
    271290    new DebugFps(5, 5);
    272291    new Fractal(ivec2(640, 480));
     292    //new DebugRecord("fractalol.ogm", 60.0f);
    273293
    274294    app.Run();
Note: See TracChangeset for help on using the changeset viewer.