Beispiel #1
0
        /// <summary>
        /// 渲染
        /// </summary>
        /// <returns>Bitmap:渲染完成的位图</returns>
        public unsafe Bitmap Render()
        {
            int w = _bmpTexture.Width;
            int h = _bmpTexture.Height;

            // 锁定位图数据
            BitmapData fdat = _bmpFrame.LockBits(new Rectangle(0, 0, _bmpTexture.Width, _bmpTexture.Height),
                                                 ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            BitmapData tdat = _bmpTexture.LockBits(new Rectangle(0, 0, _bmpTexture.Width, _bmpTexture.Height),
                                                   ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);

            // 固定当前帧浪高缓冲区
            fixed(int *buffer = _frontBuffer)
            {
                // 获取位图数据指针
                byte *faddr = (byte *)fdat.Scan0;
                byte *taddr = (byte *)tdat.Scan0;

                for (int i = w; i < w * h - w; i++)
                {
                    // 计算XY偏移(根据浪高把偏移位置的像素设置到当前位置)
                    int xo = buffer[i - 1] - buffer[i + 1];
                    int yo = buffer[i - w] - buffer[i + w];

                    // 根据偏移生成阴影着色
                    int shade = (xo - yo) / 4;

                    // 获取基准像素的坐标
                    int pxi = i * 3 + (tdat.Stride - w * 3) * (i / (tdat.Stride / 3));
                    int fxi = pxi + xo * 3 + yo * tdat.Stride;
                    if (fxi < 0)
                    {
                        fxi = pxi;
                    }
                    if (fxi >= w * h * 3)
                    {
                        fxi = pxi;
                    }

                    // 从材质获取基准像素
                    byte b = taddr[fxi];
                    byte g = taddr[fxi + 1];
                    byte r = taddr[fxi + 2];

                    // 着色
                    b = (byte)CommonUtility.CoerceValue(b + shade, 0, 255);
                    g = (byte)CommonUtility.CoerceValue(g + shade, 0, 255);
                    r = (byte)CommonUtility.CoerceValue(r + shade, 0, 255);

                    // 生成水波
                    faddr[pxi]     = b;
                    faddr[pxi + 1] = g;
                    faddr[pxi + 2] = r;
                }

                // 复制首尾行像素
                for (int i = 0; i < w * 3; i++)
                {
                    faddr[w * h * 3 - i - 1] = taddr[w * h * 3 - i - 1];
                    faddr[i] = taddr[i];
                }
            }

            // 解锁位图数据
            _bmpFrame.UnlockBits(fdat);
            _bmpTexture.UnlockBits(tdat);

            return(_bmpFrame);
        }