[Interest] Antialiasing possible on QSGGeometry?

Sletta Gunnar Gunnar.Sletta at digia.com
Mon Jun 10 09:53:59 CEST 2013


On Jun 8, 2013, at 10:41 AM, Sean Harmer <sean.harmer at kdab.com> wrote:

> On 07/06/2013 07:12, Sletta Gunnar wrote:
>> You need to set the surface format of your QQuickView.
>> 
>> QQuickView view;
>> QSurfaceFormat format = view.format();
>> format.setSamples(16);
>> view.setFormat(format);
>> view.show();
>> 
>> If your graphics hardware supports multisample antialiasing, you will now have antialiased geometry.
>> 
>> As the scene graph might require depth/stencil buffer for its renderer, it is a bit important that you inherit the original surface format from the view instead of creating a new one from scratch.
>> 
>> qmlscene supports this out of the box by passing --multisample as a command line option.
> 
> Another, but more complex, option is to do like the Rectangle does and 
> to implement antialiasing via the vertex shader used in the material for 
> that item type. That provides edge antialiasing. If you need 
> antialiasing of the contents of the item then using MSAA as Gunnar 
> suggested is easiest but be aware that it comes at a cost. 16xMSAA 
> should be fine on modern desktop cards but will likely be prohibitively 
> expensive on embedded at the moment.

Using multisampling on embedded is not guaranteed to be a problem. In fact on several hardware types it can be a great benefit.

Many embedded graphics chips, being tile-based renderers, can do per-tile multisampling with a much lower impact than desktop chips. ARM Mali-400 considers 4x multisampling negligible for instance (http://infocenter.arm.com/help/topic/com.arm.doc.dui0555a/DUI0555A_mali_optimization_guide.pdf) and on several other chips I've played around with, MSAA comes at a 10-15% added performance cost.

However, there is an upside to using MSAA, which is that most primitives are now opaque and the scenegraph can sort them front-to-back, which means we can get z-culling it can make use of "early-z" checks such as the PowerVR chips implement (http://www.imgtec.com/powervr/insider/docs/POWERVR%20Series5%20Graphics.SGX%20architecture%20guide%20for%20developers.1.0.8.External.pdf)

Edge antialiasing typically implies that the primitive is blended which, on embedded, usually comes at a much higher cost than on desktop. 


> Lower the MSAA factor to say 4x 
> will give you some AA for lower cost. Play around with it and see what 
> works for you.

This is always the best recommendation when it comes to performance. Try different things and see what works the best :)

> 
> Cheers,
> 
> Sean
> 
>> 
>> cheers,
>> Gunnar
>> 
>> On Jun 7, 2013, at 12:12 AM, Mark <markg85 at gmail.com> wrote:
>> 
>>> Hi,
>>> 
>>> Another day, another question :)
>>> Don't worry, i plan on making a big blog about everything. This
>>> information won't get lost.
>>> 
>>> So today i'm trying to draw a custom shape by setting vertices. More
>>> specifically a GL_QUAD_STRIP.
>>> 
>>> It looks like this (obviously just testing data)
>>>    QSGGeometry *geometry = new
>>> QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), 8);
>>>    geometry->setDrawingMode(GL_QUAD_STRIP);
>>>    geometry->vertexDataAsPoint2D()[0].set(0, 100);
>>>    geometry->vertexDataAsPoint2D()[1].set(0, height());
>>>    geometry->vertexDataAsPoint2D()[2].set(width() / 4, 80);
>>>    geometry->vertexDataAsPoint2D()[3].set(width() / 4, height());
>>>    geometry->vertexDataAsPoint2D()[4].set(width() / 2, 110);
>>>    geometry->vertexDataAsPoint2D()[5].set(width() / 2, height());
>>>    geometry->vertexDataAsPoint2D()[6].set(width(), 150);
>>>    geometry->vertexDataAsPoint2D()[7].set(width(), height());
>>> 
>>>    QSGFlatColorMaterial *material = new QSGFlatColorMaterial;
>>>    material->setColor(QColor(255, 0, 0, 128));
>>> 
>>>    QSGGeometryNode *n = new QSGGeometryNode;
>>>    n->setGeometry(geometry);
>>>    n->setFlag(QSGNode::OwnsGeometry);
>>>    n->setMaterial(material);
>>>    n->setFlag(QSGNode::OwnsMaterial);
>>> 
>>> So roughly the same as the example [1] only with a quad strip.
>>> However, this ends up looking a bit aliased.. So the question is: How
>>> do i get this anti-aliased?
>>> 
>>> I did read something about multisampling and setting the number of
>>> samples, but i can't find such a function in any of the used classes..
>>> 
>>> Kind regards,
>>> Mark
>>> 
>>> [1] http://qt-project.org/doc/qt-5.0/qtquick/qsggeometrynode.html
>>> _______________________________________________
>>> Interest mailing list
>>> Interest at qt-project.org
>>> http://lists.qt-project.org/mailman/listinfo/interest
>> _______________________________________________
>> Interest mailing list
>> Interest at qt-project.org
>> http://lists.qt-project.org/mailman/listinfo/interest
>> 
> 
> 
> -- 
> Dr Sean Harmer | sean.harmer at kdab.com | Senior Software Engineer
> Klarälvdalens Datakonsult AB, a KDAB Group company
> Tel. Sweden (HQ) +46-563-540090, USA +1-866-777-KDAB(5322)
> KDAB - Qt Experts - Platform-independent software solutions
> 
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest




More information about the Interest mailing list