Woj*_*ilo 14 c++ opengl shader qt qml
我已经看到在QML中有一个Bezier曲线的示例实现,但我正在寻找一个如何实现虚线或点状贝塞尔曲线的提示.据我所知,Bezier曲线示例的作者QSGGeometryNode用于存储内部,QSGGeometry并QSGFlatColorMaterial在其上应用了材料.然后,他们只需创建点列表并在它们之间绘制段.
是否有可能写一个shader,并把它应用到QSGFlatColorMaterial(以显示线dashed,dotted等等)?
最终,是否可以存储多个QSGGeometry内部QSGGeometryNode?
UPDATE
我想在"纯QtQuick"中实现它- 而不是在"旧"接口(例如QPainter etc)中 - 因为我不想使用切换上下文(openGL和CPU)的东西.我更喜欢使用自定义着色器的解决方案(如果它可行) - 因为我将有更多的可能性来实现自定义外观(虚线,溺爱,彩色,可能是动画等).
如果不可能,我会用QPainter.
我不认为这个任务是实现使用的好选择QSGGeometryNode,使用QPainter基于绘图和a 来实现它会容易得多QQuickPaintedItem.您仍然可以获得OpenGL的好处,因为QPainter它也支持GL绘图,它仍然比软件更快.您可以使用QPen带有点线或虚线图案的库存,也可以使用简单的库存QVector.
或者,您可以使用自定义GL绘图方法,而不是使用Qt提供的类,这些类在表示高级复合几何时非常有限.您甚至可以使用实例化(如果可用)来进一步提高性能,只需沿路径曲线定位破折号或点几何.
最后但并非最不重要的是,您可以使用QML Canvas元素,它支持几乎相同的操作,QPainter并且可能提供相同的性能.
编辑:正如您的更新所示,您错过了我所说的QPainter可以在软件和GL中绘制的部分,而GL绘图通常要快得多.此外,通过绘制到GL上下文,您不必将帧缓冲区从CPU移动到GPU内存,而是将其保存在GPU内存中.所以没有开销.至于动画和其他东西,当然,QPainter你不可能只限于任何QPen提供 - 不同的连接,帽子等可以用来在一定程度上修改形状,但没有奇迹......它不会也可以使用着色器,只能使用自定义几何体.如果你QObject为每个破折号/点元素使用一个基础对象,以便独立地为它们设置动画,它将最终非常昂贵,QObject非常沉重,不应该用这样轻的手.因此,如果您想要这种灵活性,那么定制GL渲染到FBO几乎是要走的路,但是您将不得不完全退出QtQuick API并进入GL领域.
无论如何,虚线着色器不应该是那么复杂,基本上你根据曲线的距离和沿着它的长度的"周期"为片段着色.我找到了这个例子,自己没试过.您可以为阈值设置动画,甚至使用正弦函数来获得时髦的样式.
至于"纯粹的"QtQuick实现,API并没有真正设计用于处理这种类型的绘图任务,这就是为什么提供Canvas元素来填补空白并从QML/JS获得高级痛苦功能的原因.Canvas实际上是一个QPainter吸引FBO 的包装器.
最后,它不会归结为可能/不可能的东西,但哪种方法最有意义,并且最有效地完成工作.首先尝试这种QQuickPaintedItem方法,因为它是最简单的,如果你对性能不满意,你可以实现另一个更复杂的解决方案和配置文件.毕竟,这就是为什么首先QQuickPaintedItem被引入 - 处理传统绘画,这对于QQuickItem课堂来说不方便.
| 归档时间: |
|
| 查看次数: |
7971 次 |
| 最近记录: |