1
I am new to QtOpengl, I am doing offscreen rendering and storing framebufferobject in QImage, this Qimage I am passing to QPainter to draw circle, but it is drawing 4 circles event for once drawImage qpainter call. 

1: 以下のコード スニペットを見つけてください。Qimage を楕円のような作成された形状のシェーダーに渡す場合、シェーダー コードに別の方法を渡す必要があります。提案してください。

2: 以下では、コンストラクターで Qpainter を使用して形状を作成しました。

3:次に、画像をレンダリングするためのopengl呼び出しであるgetImgResultを呼び出します

4: fbo バッファ データを QImage に格納しています

5: この Qimage は、ペイント メソッド内で使用して、drawImage API を使用して形状を描画します。

polygon::polygon(QQuickItem *parent)
    : QQuickPaintedItem(parent)

{
#ifdef FRAMEBUFFEROBJECT
  setRenderTarget(QQuickPaintedItem::FramebufferObject);
#else
  setRenderTarget(QQuickPaintedItem::Image);
#endif
  QImage image(100, 100, QImage::Format_ARGB32);
  image.fill(QColor(0, 0, 0, 0));
  QPainter mpainter;
  mpainter.begin(&image);
  QBrush myBrush;
  myBrush.setStyle(Qt::SolidPattern);
  QColor mycolor(QColor(255, 0, 0, 255));
  myBrush.setColor(mycolor);
  mpainter.setBrush(myBrush);
  mpainter.drawEllipse(0, 0, 100, 100);
  getResultImg(image, 1);
}
polygon::~polygon() {}

void polygon::paint(QPainter *painter) { painter = drawPolygon(painter); }

QPainter *polygon::drawPolygon(QPainter *painter) {
 
  painter->drawImage(QRectF(70, 70, m_matriximg.width(), m_matriximg.height()),
                     m_matriximg);    
 [![**enter image description here**][1]][1]
  return painter;
}

void polygon::getResultImg(QImage image, int num) {

  //   =======CONTEXT SETUP======
  //   Set OpenGL version to use
  QSurfaceFormat surfaceFormat;
  surfaceFormat.setMajorVersion(4);
  surfaceFormat.setMinorVersion(3);
  QOpenGLContext openGLContext;
  openGLContext.setFormat(surfaceFormat);
  openGLContext.create();
  if (!openGLContext.isValid())
    qDebug("Unable to create context");

  QOffscreenSurface surface;
  surface.setFormat(surfaceFormat);
  surface.create();
  if (!surface.isValid())
    qDebug("Unable to create the Offscreen surface");

  openGLContext.makeCurrent(&surface);

  //   Viewport size
  QSize vpSize = QSize(100, 100);

  QOpenGLFramebufferObjectFormat fboFormat;
  fboFormat.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
  QOpenGLFramebufferObject fbo(vpSize, fboFormat);
  openGLContext.functions()->glViewport(0, 0, vpSize.width(), vpSize.height());
  fbo.bind();

  //    ========GEOMEETRY SETUP========

  static const float vertexPositions[] = {-1.0f, 1.0f,  1.0f,  1.0f,
                                          1.0f,  -1.0f, -1.0f, 1.0f,
                                          -1.0f, -1.0f, 1.0f,  -1.0f};

  static const float vertexColors[] = {1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
                                       0.0f, 0.0f, 0.0f, 1.0f};

  QOpenGLBuffer vertexPositionBuffer(QOpenGLBuffer::VertexBuffer);
  vertexPositionBuffer.create();
  vertexPositionBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);
  vertexPositionBuffer.bind();
  vertexPositionBuffer.allocate(vertexPositions, 12 * sizeof(float));

  QOpenGLBuffer vertexColorBuffer(QOpenGLBuffer::VertexBuffer);
  vertexColorBuffer.create();
  vertexColorBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);
  vertexColorBuffer.bind();
  vertexColorBuffer.allocate(vertexColors, 9 * sizeof(float));

  QOpenGLShaderProgram program;
  QOpenGLTexture *m_texture = new QOpenGLTexture(image);
  uint texture_unit = 1;
  m_texture->bind(texture_unit);
  program.addShaderFromSourceCode(
      QOpenGLShader::Vertex, "#version 330\r\n"
                             "in vec2 position;\n"
                             "varying highp vec2 coords;\n"
                             "in vec4 color;\n"
                             "out vec4 fragColor;\n"
                             "void main() {\n"
                             "    fragColor = color;\n"
                             "    gl_Position = vec4(position, 0.0, 1.0);\n"
                             "coords=position.xy;\n"
                             "}\n");
  program.addShaderFromSourceCode(
      QOpenGLShader::Fragment,
      "#version 330\r\n"
      "in vec4 fragColor;\n"
      "in vec2 position;\n"
      "varying highp vec2 coords;\n"
      "out vec4 color;\n"
      "uniform sampler2D source;\n"
      "uniform mat4 m_view;"
      "uniform vec4 offset;"
      "uniform float dividervalue;"
      "void main() {\n"
      "mat4 "
      "float s=0.46;"
      "float angle=-175.0;"
      "vec4 image = texture2D(source,coords.xy);\n"
      "if(dividervalue == 1)"
      "color = image;\n"
      "}\n");
  program.link();
  program.bind();

  QOpenGLVertexArrayObject vao;
  vao.create();
  vao.bind();
  program.setUniformValue("source", texture_unit);
  vertexPositionBuffer.bind();
  program.enableAttributeArray("position");
  program.setAttributeBuffer("position", GL_FLOAT, 0, 2);

  vertexColorBuffer.bind();
  program.enableAttributeArray("color");
  program.setAttributeBuffer("color", GL_FLOAT, 0, 3);
  openGLContext.functions()->glUseProgram(1);
  float mat[4][4] = {0.20, 0.20, 0.45, 0.45, 0.33, 0.33, 0.45, 0.45,
                     0.0,  0.0,  0.0,  0.33, 0.0,  0.0,  0.0,  1.0};
  float vec[4] = {0.0, 0.0, 0.0, 0.0};

  GLint transformLocation =
      openGLContext.functions()->glGetUniformLocation(1, "m_view");
  openGLContext.functions()->glUniformMatrix4fv(transformLocation, 1, GL_FALSE,
                                                &mat[0][0]);

  openGLContext.functions()->glUniform4fv(
      openGLContext.functions()->glGetUniformLocation(1, "offset"), 1, &vec[0]);
  float dividervalue = num;
  program.setUniformValue("dividervalue", dividervalue);

  //    ==============DRAWING TO THE FBO============

  openGLContext.functions()->glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  openGLContext.functions()->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  openGLContext.functions()->glDrawArrays(GL_TRIANGLE_STRIP, 0, 6);
  program.disableAttributeArray("position");
  program.disableAttributeArray("color");
  program.release();
  fbo.release();

  //    ========SAVE IMAGE===========

  m_matriximg = fbo.toImage();
} 

fboを使用してopengコンテキストからQImageを取得したときの実際の結果である画像を添付しています。1 円を期待していたのに 4 円になりました。どこが間違っているのか理解できません。

4

0 に答える 0