介绍
rgfw是一个轻量级的单头窗口库,它的源代码可以在这里找到。
本教程基于其源代码。
软件渲染的基本思想很简单。归根结底就是绘制到缓冲区并将其传输到屏幕。
然而,使用低级 api 时软件渲染会更加复杂,因为您必须
正确初始化渲染上下文,告诉 api 如何期望数据。然后要绘制就必须使用api的函数
blit 到屏幕,这可能很复杂。
本教程解释了rgfw如何处理软件渲染,以便您可以了解如何自己实现。
注意:macos 代码将在编写时考虑到 cocoa c 包装器(请参阅 rgfw.h 或 silicon.h)
概述
所需步骤的快速概述
- 初始化缓冲区和渲染上下文
- 绘制到缓冲区
- 将缓冲区传输到屏幕
- 免费剩余数据
第 1 步(初始化缓冲区和渲染上下文)
注意:您可能希望缓冲区的大小大于窗口,这样您就可以缩放缓冲区的大小而无需重新分配它。
在 x11 上,您首先创建一个视觉(或像素格式)来告诉窗口如何处理绘制数据。
然后为缓冲区创建一个位图来渲染,rgfw 使用 ximage 结构作为位图。
接下来,您使用显示和窗口数据创建图形上下文 (gc)。 gc是用来告诉x11如何给
窗口绘制数据。
这也是你可以分配缓冲区的地方。必须为除 windows 之外的每个平台分配缓冲区。
为此,您需要使用 xmatchvisualinfo、xcreateimage 和 xcreategc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
在 windows 上,您将首先创建位图标头,该标头用于创建指定格式的位图。
格式结构用于告诉 windows api 如何将缓冲区渲染到屏幕上。
接下来,创建一个分配在内存中的绘图上下文句柄(hdc),用于稍后选择位图。
注意:windows 不需要分配缓冲区,因为 winapi 会为我们处理该内存。您也可以手动分配内存。
相关文档:bitmapv5header、createdibsection 和 createcompatibledc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
在macos上,没有太多设置,大部分工作都是在渲染过程中完成的。
你只需要分配缓冲区数据即可。
1 |
|
第2步(绘制到缓冲区)
在本教程中,我将使用 silk.h 绘制到缓冲区。 silk.h是一个单头软件渲染图形库。
首先包括丝绸,
1 2 3 4 |
|
现在可以使用silk渲染了。
846467155365
步骤 3(将缓冲区传输到屏幕)
在x11上,首先将位图数据设置到缓冲区。
位图数据将使用bgr渲染,所以你必须
如果要使用 rgb,请转换数据。那你就得用xputimage
使用gc将ximage绘制到窗口。
相关文档:xputimage
1 2 3 4 5 6 7 8 9 10 |
|
在 windows 上,您必须首先选择位图并确保保存最后选择的对象,以便稍后可以重新选择它。
现在您可以将位图传输到屏幕并重新选择旧位图。
相关文档:selectobject 和 bitblt
1 2 3 |
|
在macos上,根据您的窗口设置视图的calayer,这用于将图像渲染到屏幕上。
接下来,使用缓冲区创建图像(位图)。
最后,您可以将图像添加到图层的图形上下文中,并将图层绘制并刷新到屏幕上。
相关文档:cgcolorspacecreatedevicergb、cgbitmapcontextcreate、cgbitmapcontextcreateimage、cgcolorspacerelease、cgcontextrelease、
calayer、nsgraphicscontext、cgcontextdrawimage、flushgraphics 和 cgimagerelease
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
|
步骤 4(免费剩余数据)
渲染完成后,您应该使用相应的api函数释放位图和图像数据。
在 x11 和 macos 上,您还应该释放缓冲区。
在x11上你必须使用xdestoryimage和xfreegc。
288254941586
在windows上,必须使用deletedc和deleteobject。
1 2 |
|
macos 上必须使用release.
1 2 3 |
|
完整的例子
x11
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
|
视窗
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
|