Thread
GPU画图工具
-
GPU画图工具
研究了使用GPU的无限画布像素模式画图工具的可行性,简要记录在此,细节参阅160本。
→从对MyPaint研究引出事实上现在看来可能可以复用之前的NUL界面库来做个简单画图程序,在PC机上用,因此可以使用GL等方便地加速,而无需担心在移动设备上运行耗电的问题。
-
→
该工具特点
- 无限画布(最终取决于客户机内存)
- 有限撤销步数。(达到撤销步数的笔触合成到最终光栅上,未达到的为GL图元)
- 基于像素而非矢量显示。
主要局限
一些低功耗硬件可能不具备足够显存和内存以运行大图。SurfacePro6的
glxinfo
报GL最大贴图尺寸为16384×8192,显存报3058MB共享,因此目前的大图应该能合理工作,更大的效率就比较低了。无法混合和快速在原地累积,因此半透明刷子可能是很大的问题。
-
→
主要操作细节
贴图步进尺寸似乎可以设置为128,这也可以作为初始最小贴图的尺寸(但根据初始引用笔刷直接调节至下一个合理尺寸),每次步进就复制到新的上面,同时检查再建立同样大小伪贴图的可行性,不行则表明不能再请求这么多的显存用于贴图复制,此时启用局部高清贴图模式,丢掉未显示的那些(从内存中再读)。
涂抹和取色器采样似乎都只能从两层画完之后的视口FBO采,这样也能采到笔刷自身痕迹?(是期望的行为吗?)
保存就贴图分块读回来存。
时间原始时间每1/60秒更新一次笔刷显示列表,每提笔更新显示列表并应用最后一个撤销栈的笔画到光栅,对于不完整主图,需要重复调用内存里的那个图。
-
→
额外贴图
- 主图,超尺寸的用多张Tile,显存无法分配完全的则只分配以屏幕为中心的大于屏幕的尺寸,做笔刷整合时则需要多次切换并从内存中调入完整图(以每图而不是每笔刷为循环基准)。
- 缩小贴图,用于缩小时查看,为每个主图块的小图,尚不知如何生成最好,(可能需要从CPU端生成?这样每应用一笔都需要读回来)。
- 视口FBO,复用GUI的面板FBO,则无需新建,但注意像素格式,可能需要16位。
视口FBO复制,因为需要一并混合到应用好的主图上。似乎可以直接采样底图并画到视口FBO,可以节省一个FBO。
-
→
其他局限
笔刷的序列混合不好实现,由于是并行提交,没有办法直接访问已工作的方块,所以可能只能以不透明和上次笔触完成后的FBO复制用以采样的方式工作。
检查了之前的GUI截图,序列透明覆盖似乎是正确的,那么非半透明的覆盖应该也是顺序正常的,并且可以使用深度。但由于界面有浮动面板,这里实际不清楚能否去掉那些的FBO因为是二次叠上去的,不同面板不一定同时都刷新。
-
→
更新:了解到GL_NV_texture_barrier↗可能可以允许同时读写同一张贴图,应该可以实现方便的点点点叠加,应该也容易实现笔划(但没有具体看,好像稍微麻烦些,主要是笔画的情况下如何定义自身叠加和非叠加,使用二级图应当能旁路这个问题,不过在不清楚笔画尺寸的情况下需要画多个块拼接)
2022/05/26 14:28:23