软件光栅器五之win32环境下如何绘制像素
来源:互联网 发布:怎样进行博客seo 编辑:程序博客网 时间:2024/06/06 05:27
win32下 如何绘制像素,也许到你看到这个问题的时候会马上想到win32的绘制像素函数SetPixel(),然后笑而不语,然后我想告诉你,如果你用SetPixel函数来做这个软件渲染器的话,那运行效率将低的可怜,假设我们的视口屏幕为800X600的分辨率,也就是屏幕上有800X600个(48万个)像素点,也就是绘制整个屏幕的像素你得至少调用48W次SetPixel函数,那将是多么低的效率,在网上我找到了一种方法,也就是定义一个缓存,然后在缓存相应位置(对应屏幕的一个像素的位置)存入一个代表颜色的数据,在每帧的最后将缓存的数据作为颜色全部输入到屏幕,这样效率大大提高,下面请看实现代码:
//屏幕宽度和高度 #define SCREEN_WIDTH 800#define SCREEN_HEIGHT 600#define bits 24 //每个像素的位数//背后缓存,深度缓存BYTE buffer[SCREEN_WIDTH*SCREEN_HEIGHT*bits / 8]; //每三个byte为一个像素,总共有800*600个像素,800*600*3个byte,BGR的颜色存储顺序,//主窗口的HDC和handlestatic HDC screen_hdc;static HWND screen_hwnd;static HDC hCompatibleDC; //兼容HDCstatic HBITMAP hCompatibleBitmap; //兼容BITMAPstatic HBITMAP hOldBitmap; //旧的BITMAP static BITMAPINFO binfo; //BITMAPINFO结构体 //填充BITMAPINFO结构体 ZeroMemory(&binfo, sizeof(BITMAPINFO)); binfo.bmiHeader.biBitCount = 24; //每个像素多少位,也可直接写24(RGB)或者32(RGBA) binfo.bmiHeader.biCompression = BI_RGB; binfo.bmiHeader.biHeight = -SCREEN_HEIGHT; binfo.bmiHeader.biPlanes = 1; binfo.bmiHeader.biSizeImage = 0; binfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); binfo.bmiHeader.biWidth = SCREEN_WIDTH; //获取屏幕HDC screen_hwnd = hwnd; screen_hdc = GetDC(screen_hwnd); //获取兼容HDC和兼容Bitmap,兼容Bitmap选入兼容HDC(每个HDC内存每时刻仅能选入一个GDI资源,GDI资源要选入HDC才能进行绘制) hCompatibleDC = CreateCompatibleDC(screen_hdc); hCompatibleBitmap = CreateCompatibleBitmap(screen_hdc, SCREEN_WIDTH, SCREEN_HEIGHT); hOldBitmap = (HBITMAP)SelectObject(hCompatibleDC, hCompatibleBitmap); //将颜色数据打印到屏幕上,这下面两个函数每帧都得调用 SetDIBits(screen_hdc, hCompatibleBitmap, 0, SCREEN_HEIGHT, buffer, (BITMAPINFO*)&binfo, DIB_RGB_COLORS); BitBlt(screen_hdc, -1, -1, SCREEN_WIDTH, SCREEN_HEIGHT, hCompatibleDC, 0, 0, SRCCOPY);
buffer[int(y) * 800 * 3 + (int(x) + 1) * 3 - 1] = b;buffer[int(y) * 800 * 3 + (int(x) + 1) * 3 - 2] = g;buffer[int(y) * 800 * 3 + (int(x) + 1) * 3 - 3] = r;
细心的你也许会发现在位置上颜色顺序为bgr,这点我也不知道是为什么
写了好几篇技术博客,放出程序的运行截图:
放出我的软件渲染器源代码:
http://download.csdn.net/detail/qq_29523119/9698519
0 0
- 软件光栅器五之win32环境下如何绘制像素
- 软件光栅化渲染器(五)
- 从零开始写光栅化渲染器1:绘制一个像素点
- 在Win32下搭建opengl绘制环境
- 软件光栅器一之向量,顶点,矩阵
- 软件光栅器六之透视纹理映射
- 光栅渲染器(一)配置glut环境,完成窗体绘制
- 光栅渲染器(四)多边形绘制
- ios 如何绘制一像素
- 图形学(3)光栅图形学的直线绘制(下)
- 软件光栅器的设计思想
- 软件光栅化渲染器(一)
- 软件光栅化渲染器(二)
- 软件光栅化渲染器(三)
- 软件光栅化渲染器(四)
- 软件光栅化渲染器(六)
- 软件光栅化渲染器(七)
- 软件光栅化渲染器(八)
- 52. N-Queens II[hard]
- 视频前背景分离论文之(3) Group Sparsity in Nonnegative Matrix Factorization
- 深度学习caffe搭建
- DOM对象与jQuery 对象区别
- DFS
- 软件光栅器五之win32环境下如何绘制像素
- 1034. Head of a Gang (30)
- SQLserver学习day05 T-SQL数据操作(查询) 常用的函数
- required~placeholder~autofocus解释
- leetcode刷题之旅——112. Path Sum
- 从实践项目开发反思人月神话
- 【51nod1103】【N的倍数】【构造】
- PAT-B:1016. 部分A+B (15)
- 从标准输入中读取几行输入,每行输入都要打印到标准输出上,前面要加上行号。在编写这个程序时要是图让程序能够处理的输入行的长度没