Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Access violation in QImage from QRenderCapture
Forum Updated to NodeBB v4.3 + New Features

Access violation in QImage from QRenderCapture

Scheduled Pinned Locked Moved Solved General and Desktop
13 Posts 4 Posters 969 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • A Offline
    A Offline
    Argostin
    wrote on last edited by
    #3

    I am using Qt 6.1.2 on Windows 10.

    1 Reply Last reply
    0
    • A Offline
      A Offline
      Argostin
      wrote on last edited by
      #4

      Here is my code:

      main.cpp:

      #include <windows.h>
      #include <QtWidgets/qapplication.h>
      #include "My3DWindow.h"
      
      int WINAPI WinMain(
      _In_ HINSTANCE hInstance,
      _In_opt_ HINSTANCE hPrevInstance,
      _In_ LPSTR lpCmdLine,
      _In_ int nShowCmd
      ) {
      int temp = 0;
      QApplication app(temp, &lpCmdLine);
      My3dWindow myWindow;
      myWindow.start();
      
      return app.exec();
      }
      

      My3dWindow.h:

      #pragma once
      
      #include <Qt3DCore/QEntity>
      #include <Qt3DExtras/qt3dwindow.h>
      #include <Qt3DRender/QCamera>
      #include <Qt3DRender/QRenderCapture>
      
      class My3dWindow : public Qt3DExtras::Qt3DWindow {
      Q_OBJECT
      public:
      void start();
      private:
      void createSceneGraph(); //1
      void createCamera(); //2
      void createFrameGraph(); //3
      Qt3DCore::QEntity* rootEntity;
      Qt3DRender::QCamera* cameraObject;
      Qt3DRender::QRenderCapture* renderCapture;
      Qt3DRender::QRenderCaptureReply* reply;
      
      private slots:
      void onImageRendered();
      
      private:
      void requestRenderCapture();
      };
      

      My3dWindow.cpp:

      #include "My3dWindow.h"
      
      #include <Qt3DExtras/QCuboidMesh>
      #include <Qt3DExtras/QDiffuseSpecularMaterial>
      #include <Qt3DRender/QRenderSurfaceSelector>
      #include <Qt3DRender/QViewport>
      #include <Qt3DRender/QCameraSelector>
      #include <Qt3DRender/QClearBuffers>
      #include <Qt3DExtras/QOrbitCameraController>
      #include <Qt3DRender/QCameraLens>
      
      void My3dWindow::start() {
          reply = nullptr;
          createSceneGraph();
          createCamera();
          createFrameGraph();
          this->show();
          requestRenderCapture();
      }
      
      void My3dWindow::createSceneGraph() {
      rootEntity = new Qt3DCore::QEntity();
      Qt3DCore::QEntity* cubeEntity = new Qt3DCore::QEntity(rootEntity);
      
      Qt3DExtras::QCuboidMesh* cuboidMesh = new Qt3DExtras::QCuboidMesh();
      cubeEntity->addComponent(cuboidMesh);
      
      Qt3DExtras::QDiffuseSpecularMaterial* material = new
      Qt3DExtras::QDiffuseSpecularMaterial();
      QColor materialColor(200, 100, 50);
      material->setDiffuse(materialColor);
      material->setAmbient(materialColor);
      cubeEntity->addComponent(material);
      
      this->setRootEntity(rootEntity);
      }
      
      void My3dWindow::createCamera() {
          static constexpr QVector3D cameraUpVector(0.0f, 1.0f, 0.0f);
          static constexpr QVector3D cameraPosition(40.0f, 40.0f, 40.0f);
          static constexpr QVector3D cameraViewCenter(0.0f, 0.0f, 0.0f);
          static constexpr float cameraLinearSpeed = 50.0f;
          static constexpr float cameraLookSpeed = 180.0f;
      
          cameraObject = this->camera();
          cameraObject->setProjectionType(Qt3DRender::QCameraLens::PerspectiveProjection);
          cameraObject->setUpVector(cameraUpVector);
          cameraObject->setPosition(cameraPosition);
          cameraObject->setViewCenter(cameraViewCenter);
      
          Qt3DExtras::QOrbitCameraController* camController = new
      Qt3DExtras::QOrbitCameraController(rootEntity);
          camController->setLinearSpeed(cameraLinearSpeed);
          camController->setLookSpeed(cameraLookSpeed);
          camController->setCamera(cameraObject);
          camController->setEnabled(true);
      }
      
      void My3dWindow::createFrameGraph() {
          Qt3DRender::QRenderSurfaceSelector* surfaceSelector = new
      Qt3DRender::QRenderSurfaceSelector;
          surfaceSelector->setSurface(this);
          /*surfaceSelector*/ {
              Qt3DRender::QViewport* viewport = new
      Qt3DRender::QViewport(surfaceSelector);
              viewport->setNormalizedRect(QRectF(0, 0, 1.0, 1.0));
              /*viewport*/ {
                  Qt3DRender::QCameraSelector* cameraSelector = new
      Qt3DRender::QCameraSelector(viewport);
                  cameraSelector->setCamera(cameraObject);
                  /*cameraSelector*/ {
                      Qt3DRender::QClearBuffers* clearBuffers = new
      Qt3DRender::QClearBuffers(cameraSelector);
      
      clearBuffers->setBuffers(Qt3DRender::QClearBuffers::ColorDepthBuffer);
                      clearBuffers->setClearColor(QColor(50, 50, 50));
                      /*clearBuffers*/ {
                          renderCapture = new
      Qt3DRender::QRenderCapture(clearBuffers);
                      }
                  }
              }
          }
      
          this->setActiveFrameGraph(surfaceSelector);
      }
      
      void My3dWindow::requestRenderCapture() {
          if (!reply) {
              reply = renderCapture->requestCapture();
              connect(reply, &Qt3DRender::QRenderCaptureReply::completed,
      this, &My3dWindow::onImageRendered);
          }
      }
      
      void My3dWindow::onImageRendered() {
      QImage* qimage = new QImage(reply->image());
      
      qDebug() << "Image size in bytes:" << qimage->sizeInBytes();
      qDebug() << "Width:" << qimage->width() << "Height:" << qimage->height();
      
      
      QColor rgb = qimage->pixel(QPoint(0, 0));
          qDebug() << "Color: " << " " << rgb.red() << " " << rgb.green() <<
      " " << rgb.blue();
      
      
      reply->deleteLater();
      reply = nullptr;
      
      requestRenderCapture();
      }
      

      It stops as soon as it hits the "QColor rgb = qimage->pixel(QPoint(0, 0));" line, and it gives me the read access violation

      1 Reply Last reply
      0
      • O Offline
        O Offline
        ollarch
        wrote on last edited by
        #5

        @Argostin said in Access violation in QImage from QRenderCapture:

        QImage* qimage = new QImage(reply->image());

        Here you are creating an image on every function call.

        @Argostin said in Access violation in QImage from QRenderCapture:

        reply->deleteLater();
        reply = nullptr;

        You create an image that does not copy the data, it stores the pointer to the data and finally you are deleting it.

        A 1 Reply Last reply
        0
        • O ollarch

          @Argostin said in Access violation in QImage from QRenderCapture:

          QImage* qimage = new QImage(reply->image());

          Here you are creating an image on every function call.

          @Argostin said in Access violation in QImage from QRenderCapture:

          reply->deleteLater();
          reply = nullptr;

          You create an image that does not copy the data, it stores the pointer to the data and finally you are deleting it.

          A Offline
          A Offline
          Argostin
          wrote on last edited by
          #6

          Hi @ollarch
          I don't think this is part of the main problem, because the program stops on the first iteration so the code:

          reply->deleteLater();
          reply = nullptr;
          

          isn't even executed.

          But still, how do you suggest I should rework it?

          1 Reply Last reply
          0
          • O Offline
            O Offline
            ollarch
            wrote on last edited by
            #7

            Hi,

            If the image have to be used after deleting the reply you need to copy it.

            Have you checked the call stack on debugger just when it crash?

            1 Reply Last reply
            0
            • A Offline
              A Offline
              Argostin
              wrote on last edited by Argostin
              #8

              Here is the call stack:
              call stack
              Also, "RenderCapture" is the name of the project

              JonBJ 1 Reply Last reply
              0
              • A Argostin

                Here is the call stack:
                call stack
                Also, "RenderCapture" is the name of the project

                JonBJ Offline
                JonBJ Offline
                JonB
                wrote on last edited by JonB
                #9

                @Argostin
                Prior to your qimage->pixel() what happens if you go qimage->copy()? Does that violate too?

                Since QPoint(0, 0) is a null QPoint, humour me by trying some coordinates other than that?

                A 1 Reply Last reply
                0
                • JonBJ JonB

                  @Argostin
                  Prior to your qimage->pixel() what happens if you go qimage->copy()? Does that violate too?

                  Since QPoint(0, 0) is a null QPoint, humour me by trying some coordinates other than that?

                  A Offline
                  A Offline
                  Argostin
                  wrote on last edited by
                  #10

                  @JonB
                  Yes, qimage->copy() does violate in the same way and I've tried several different points but none of them worked.
                  Still, thanks for the suggestions.

                  1 Reply Last reply
                  0
                  • A Offline
                    A Offline
                    Argostin
                    wrote on last edited by
                    #11

                    As a last resort, I installed a new version of Qt (I was with 6.1.2 and now I'm with 6.2.0) and now it works properly. No more crashing and read access violations.
                    I guess it is some kind of a bug.

                    JonBJ O 2 Replies Last reply
                    4
                    • A Argostin

                      As a last resort, I installed a new version of Qt (I was with 6.1.2 and now I'm with 6.2.0) and now it works properly. No more crashing and read access violations.
                      I guess it is some kind of a bug.

                      JonBJ Offline
                      JonBJ Offline
                      JonB
                      wrote on last edited by
                      #12

                      @Argostin LOL, well done!

                      1 Reply Last reply
                      0
                      • A Argostin

                        As a last resort, I installed a new version of Qt (I was with 6.1.2 and now I'm with 6.2.0) and now it works properly. No more crashing and read access violations.
                        I guess it is some kind of a bug.

                        O Offline
                        O Offline
                        ollarch
                        wrote on last edited by
                        #13

                        @Argostin Good job!

                        1 Reply Last reply
                        0

                        • Login

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • Users
                        • Groups
                        • Search
                        • Get Qt Extensions
                        • Unsolved