研究了使用GPU的无限画布像素模式画图工具的可行性,简要记录在此,细节参阅160本。
笔刷的序列混合不好实现,由于是并行提交,没有办法直接访问已工作的方块,所以可能只能以不透明和上次笔触完成后的FBO复制用以采样的方式工作。
检查了之前的GUI截图,序列透明覆盖似乎是正确的,那么非半透明的覆盖应该也是顺序正常的,并且可以使用深度。但由于界面有浮动面板,这里实际不清楚能否去掉那些的FBO因为是二次叠上去的,不同面板不一定同时都刷新。
贴图步进尺寸似乎可以设置为128,这也可以作为初始最小贴图的尺寸(但根据初始引用笔刷直接调节至下一个合理尺寸),每次步进就复制到新的上面,同时检查再建立同样大小伪贴图的可行性,不行则表明不能再请求这么多的显存用于贴图复制,此时启用局部高清贴图模式,丢掉未显示的那些(从内存中再读)。
涂抹和取色器采样似乎都只能从两层画完之后的视口FBO采,这样也能采到笔刷自身痕迹?(是期望的行为吗?)
保存就贴图分块读回来存。
时间原始时间每1/60秒更新一次笔刷显示列表,每提笔更新显示列表并应用最后一个撤销栈的笔画到光栅,对于不完整主图,需要重复调用内存里的那个图。
一些低功耗硬件可能不具备足够显存和内存以运行大图。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笔刷形式,还需要:
映射挂件的撤销有问题,暂时还没管那么多,但需要修。
空了来
新的映射挂件
节点笔刷初步
可以撤销了
这样一来所有基本功能已经全部完成了。
储存单实例属性需要修改接口,做了个简化的假列表来支持单实例的指定文件保存。
其他的似乎都正常工作,还差导出的合成颜色。
总的来说,还有这些需要实现了才能共享该程序的初步版本:
可以文件了
涂抹正确了
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