unsafe void Draw()
        {
            m_bmp.Lock();

            for (int y = 0; y < m_bmp.PixelHeight; ++y)
            {
                int *p = (int *)(m_bmp.BackBuffer + m_bmp.BackBufferStride * y);

                for (int x = 0; x < m_bmp.PixelWidth; ++x)
                {
                    double fx = (double)x / m_bmp.PixelWidth;
                    double fy = (double)y / m_bmp.PixelHeight;

                    Color3 c = PS(fx, fy);

                    p[x] = c.ToBgra();
                }
            }

            m_bmp.AddDirtyRect(new Int32Rect(0, 0, m_bmp.PixelWidth, m_bmp.PixelHeight));
            m_bmp.Unlock();
        }