/// <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); }