- Qt 5.15
- Qt 3D
- C++ Classes
- QMultiSampleAntiAliasing
- Qt 5.15.11 Reference Documentation

# QMultiSampleAntiAliasing Class

class Qt3DRender::QMultiSampleAntiAliasing

Enable multisample antialiasing. More...

Header: | #include <QMultiSampleAntiAliasing>
qmake: | QT += 3drender
Since: | Qt 5.7
Instantiated By: | MultiSampleAntiAliasing
Inherits: | Qt3DRender::QRenderState

This class was introduced in Qt 5.7.

- List of all members, including inherited members

## Detailed Description

A Qt3DRender::QMultiSampleAntiAliasing class enables multisample antialiasing.

It can be added to a QRenderPass by calling QRenderPass::addRenderState():

     QRenderPass *renderPass = new QRenderPass();

     QMultiSampleAntiAliasing *msaa = new QMultiSampleAntiAliasing();
     renderPass->addRenderState(msaa);

Or a QRenderStateSet by calling QRenderStateSet::addRenderState():

     QRenderStateSet *renderStateSet = new QRenderStateSet();

     QMultiSampleAntiAliasing *msaa = new QMultiSampleAntiAliasing();
     renderStateSet->addRenderState(msaa);

For multisampling to take effect, the render target must have been allocated with multisampling enabled:

     QTexture2DMultisample *colorTex = new QTexture2DMultisample;
     colorTex->setFormat(QAbstractTexture::RGBA8_UNorm);
     colorTex->setWidth(1024);
     colorTex->setHeight(1024);

     QRenderTargetOutput *color = new QRenderTargetOutput;
     color->setAttachmentPoint(QRenderTargetOutput::Color0);
     color->setTexture(colorTex);

     QTexture2DMultisample *depthStencilTex = new QTexture2DMultisample;
     depthStencilTex->setFormat(QAbstractTexture::RGBA8_UNorm);
     depthStencilTex->setWidth(1024);
     depthStencilTex->setHeight(1024);

     QRenderTargetOutput *depthStencil = new QRenderTargetOutput;
     depthStencil->setAttachmentPoint(QRenderTargetOutput::DepthStencil);
     depthStencil->setTexture(depthStencilTex);

     Qt3DRender::QRenderTarget *renderTarget = new Qt3DRender::QRenderTarget;
     renderTarget->addOutput(color);
     renderTarget->addOutput(depthStencil);

Further, the shader code must use multisampling sampler types and texelFetch() instead of texture().

For example, if you have code like

     #version 150

     uniform sampler2D colorTexture;
     in vec2 texCoord;
     out vec4 fragColor;

     void main()
     {
         fragColor = texture(colorTexture, texCoord);
     }

you can rewrite it as

     #version 150

     uniform sampler2DMS colorTexture;
     in vec2 texCoord;
     out vec4 fragColor;

     void main()
     {
         ivec2 tc = ivec2(floor(textureSize(colorTexture) * texCoord));
         vec4 c = texelFetch(colorTexture, tc, 0) +
                     texelFetch(colorTexture, tc, 1) +
                     texelFetch(colorTexture, tc, 2) +
                     texelFetch(colorTexture, tc, 3);
         fragColor = c / 4.0;
     }

Note: When using OpenGL as the graphics API, glEnable(GL_MULTISAMPLE) will be called if QMultiSampleAntiAliasing has been added to the render states.