Changeset 1067


Ignore:
Timestamp:
Nov 14, 2011, 11:37:39 PM (11 years ago)
Author:
sam
Message:

tutorial: use a palette for the rendering; it gives us free dithering and
gains 10 milliseconds in the game tick.

File:
1 edited

Legend:

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

    r1066 r1067  
    5151        m_ready = false;
    5252
     53        m_palette = new u8vec4[MAX_ITERATIONS * PALETTE_STEP];
     54        for (int i = 0; i < MAX_ITERATIONS * PALETTE_STEP; i++)
     55        {
     56            float f = i / (double)PALETTE_STEP;
     57
     58            double r = 0.5 * sin(f * 0.27 - 1.5) + 0.5;
     59            double g = 0.5 * sin(f * 0.13 + 1.3) + 0.5;
     60            double b = 0.5 * sin(f * 0.21 + 0.4) + 0.5;
     61
     62            uint8_t red = r * 255.0f;
     63            uint8_t green = g * 255.0f;
     64            uint8_t blue = b * 255.0f;
     65            m_palette[i] = u8vec4(red, green, blue, 0);
     66        }
     67
    5368        m_centertext = new Text(NULL, "gfx/font/ascii.png");
    5469        m_centertext->SetPos(ivec3(5, m_size.y - 15, 1));
     
    7792        delete m_pixels;
    7893        delete m_tmppixels;
     94        delete m_palette;
    7995    }
    8096
     
    143159            {
    144160                double const maxlen = 32;
    145                 int const maxiter = 170;
    146161
    147162                f64cmplx z0 = m_center + ScreenToWorldOffset(ivec2(i, j));
     
    153168                //f64cmplx r0(0.3245046418497685, 0.04855101129280834);
    154169                f64cmplx z;
    155                 int iter = maxiter;
     170                int iter = MAX_ITERATIONS;
    156171                for (z = z0; iter && z.sqlen() < maxlen * maxlen; z = z * z + r0)
    157172                    --iter;
    158173
    159                 double f = iter;
    160                 double n = z.sqlen();
    161 
    162                 double k = log(n) * 0.5f / log(maxlen);
    163                 /* Approximate log2(k) in [1,2]. */
    164                 f += (- 0.344847817623168308695977510213252644185 * k
    165                       + 2.024664188044341212602376988171727038739) * k
    166                       - 1.674876738008591047163498125918330313237;
    167 
    168174                if (iter)
    169175                {
    170                     double r = 0.5 * sin(f * 0.27 - 1.5) + 0.5;
    171                     double g = 0.5 * sin(f * 0.13 + 1.3) + 0.5;
    172                     double b = 0.5 * sin(f * 0.21 + 0.4) + 0.5;
    173 
    174                     uint8_t red = r * 255.0f;
    175                     uint8_t green = g * 255.0f;
    176                     uint8_t blue = b * 255.0f;
    177                     *m_pixelstart++ = u8vec4(red, green, blue, 0);
     176                    double f = iter;
     177                    double n = z.sqlen();
     178
     179                    double k = log(n) * 0.5f / log(maxlen);
     180                    /* Approximate log2(k) in [1,2]. */
     181                    f += (- 0.344847817623168308695977510213252644185 * k
     182                          + 2.024664188044341212602376988171727038739) * k
     183                          - 1.674876738008591047163498125918330313237;
     184
     185                    *m_pixelstart++ = m_palette[(int)(f * PALETTE_STEP + 0.25 * m_frame)];
    178186                }
    179187                else
     
    306314
    307315/* If other frames are dirty, upload fake data for now */
    308 for (int i = 0; i < 4; i++)
     316if (0) for (int i = 0; i < 4; i++)
    309317{
    310318    if (m_dirty[i])
     
    359367
    360368private:
     369    static int const MAX_ITERATIONS = 170;
     370    static int const PALETTE_STEP = 32;
     371
    361372    ivec2 m_size;
    362     u8vec4 *m_pixels, *m_tmppixels;
     373    u8vec4 *m_pixels, *m_tmppixels, *m_palette;
    363374    Shader *m_shader;
    364375    GLuint m_texid;
Note: See TracChangeset for help on using the changeset viewer.