IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    ~~GPU画图工具实验~~ 现在是好得涂日志

    吴奕茗 (chengdulittlea@outlook.com)发表于 2023-10-04 21:20:44
    love 0

    GPU画图工具实验 现在是好得涂日志

    研究了使用GPU的无限画布像素模式画图工具的可行性,简要记录在此,细节参阅160本。

    从对MyPaint研究引出

    其他局限

    笔刷的序列混合不好实现,由于是并行提交,没有办法直接访问已工作的方块,所以可能只能以不透明和上次笔触完成后的FBO复制用以采样的方式工作。

    检查了之前的GUI截图,序列透明覆盖似乎是正确的,那么非半透明的覆盖应该也是顺序正常的,并且可以使用深度。但由于界面有浮动面板,这里实际不清楚能否去掉那些的FBO因为是二次叠上去的,不同面板不一定同时都刷新。

    额外贴图

    • 主图,超尺寸的用多张Tile,显存无法分配完全的则只分配以屏幕为中心的大于屏幕的尺寸,做笔刷整合时则需要多次切换并从内存中调入完整图(以每图而不是每笔刷为循环基准)。
    • 缩小贴图,用于缩小时查看,为每个主图块的小图,尚不知如何生成最好,(可能需要从CPU端生成?这样每应用一笔都需要读回来)。
    • 视口FBO,复用GUI的面板FBO,则无需新建,但注意像素格式,可能需要16位。
    • 视口FBO复制,因为需要一并混合到应用好的主图上。似乎可以直接采样底图并画到视口FBO,可以节省一个FBO。

    主要操作细节

    贴图步进尺寸似乎可以设置为128,这也可以作为初始最小贴图的尺寸(但根据初始引用笔刷直接调节至下一个合理尺寸),每次步进就复制到新的上面,同时检查再建立同样大小伪贴图的可行性,不行则表明不能再请求这么多的显存用于贴图复制,此时启用局部高清贴图模式,丢掉未显示的那些(从内存中再读)。

    涂抹和取色器采样似乎都只能从两层画完之后的视口FBO采,这样也能采到笔刷自身痕迹?(是期望的行为吗?)

    保存就贴图分块读回来存。

    时间原始时间每1/60秒更新一次笔刷显示列表,每提笔更新显示列表并应用最后一个撤销栈的笔画到光栅,对于不完整主图,需要重复调用内存里的那个图。

    该工具特点

    • 无限画布(最终取决于客户机内存)
    • 有限撤销步数。(达到撤销步数的笔触合成到最终光栅上,未达到的为GL图元)
    • 基于像素而非矢量显示。

    主要局限

    一些低功耗硬件可能不具备足够显存和内存以运行大图。SurfacePro6的glxinfo报GL最大贴图尺寸为16384×8192,显存报3058MB共享,因此目前的大图应该能合理工作,更大的效率就比较低了。

    无法混合和快速在原地累积,因此半透明刷子可能是很大的问题。

    更新:了解到GL_NV_texture_barrier↗可能可以允许同时读写同一张贴图,应该可以实现方便的点点点叠加,应该也容易实现笔划(但没有具体看,好像稍微麻烦些,主要是笔画的情况下如何定义自身叠加和非叠加,使用二级图应当能旁路这个问题,不过在不清楚笔画尺寸的情况下需要画多个块拼接)

    通过XInput2可以获得Wacom的压力和倾斜等参数

    图片

    可以画上去了哈哈哈

    图片
    图片

    好了至少能跑起来计算着色器了

    图片

    由于MyPaint储存为8位sRGB,因此再次打开时出现精度丢失,这是不期望的。

    研究发现可以使用计算着色器进行混合。可根据这个原理继续制作画图工具。

    此外,如果只是简单混合而没有涂抹,则可以考虑使用GL_EXT_shader_framebuffer_fetch↗

    0.1版 完成!

    图片

    汉化和各种可用性优化

    图片

    通过 这里↗ 可以下载一个测试icc以检查icc配置是否正常工作。若正常,则会显示错误颜色

    不错

    图片

    可以做笔刷了

    图片

    要复现目前使用的MyPaint笔刷形式,还需要:

    • 椭圆比例(或者sdf实现,用以更方便地获得方形)
    • 跟踪速度输入
    • 跟踪方向输入(以及平滑,如何实现)
    • 平滑位置(如何实现)
    • 随机/噪声

    映射挂件的撤销有问题,暂时还没管那么多,但需要修。

    空了来

    新的映射挂件

    图片

    节点笔刷初步

    图片
    图片

    可以撤销了

    这样一来所有基本功能已经全部完成了。

    储存单实例属性需要修改接口,做了个简化的假列表来支持单实例的指定文件保存。

    其他的似乎都正常工作,还差导出的合成颜色。

    图片

    总的来说,还有这些需要实现了才能共享该程序的初步版本:

    • 自定义的撤销命令。
    • 工程文件打包。
    • 切割文件导出。
    • 导入导出的选项。
    • 文件管理器的文件名以及过滤选项等优化。

    可以文件了

    图片

    涂抹正确了

    图片

    http://scottburns.us/subtractive-color-mixture-5/↗

    混色看这里

    以及这个是mypaint的https://github.com/mypaint/mypaint/blob/master/doc/spectral/spectral.md

    行了,涂抹的逻辑也可以了,虽然涂抹的效果不好,但是可用。

    图片

    v0.1a,测试Windows版本

    图片

    win大多数功能能用了

    Windows原生基本上可以了

    这里

    现在可以通过WSL运行(但是似乎很慢)

    图片

    修了个问题

    还是mypaint的光谱混合 但是在gpu了

    图片

    新笔刷!

    图片
    图片
    图片

    需要在软件菜单里加个版本日志按钮昂。。。

    实现了迭代控制,因此能方便地制作半色调笔刷了。

    图片

    涂抹混合有问题,已修复

    导出时图块外背景未转换为对数式,已修复

    好得涂可以实现一种多种颜色笔刷。

    一个小的抹颜色区域,或者就在画布上按住某个键给笔刷侧面上色(主要是实现起来方便一些),就可以实现花色笔刷。

    程序纹画布!

    图片

    可以利用下层特殊图层作为高度,这样采样不花额外性能,并且可以实现手工打底效果。

    2021/12/13 14:20:49 - 2023/10/04 21:20:44


沪ICP备19023445号-2号
友情链接