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 円になりました。どこが間違っているのか理解できません。