Browse Source

Initial commit

master
mmtalaie 4 years ago
commit
2a7d7aaa66
  1. 481
      OpenGLHandler.cpp
  2. 90
      OpenGLHandler.h
  3. 38
      OpenGLOffscreen.pro
  4. 335
      OpenGLOffscreen.pro.user
  5. 27
      main.cpp
  6. 9
      main.qml
  7. 5
      qml.qrc
  8. BIN
      sono.jpg

481
OpenGLHandler.cpp

@ -0,0 +1,481 @@
#include <QImageReader>
#include <QOpenGLFunctions>
#include <QOpenGLBuffer>
#include "OpenGLHandler.h"
OpenGLHandler::OpenGLHandler() : _texture(QOpenGLTexture::Target2D)
{
if(!_context.create())
{
qDebug() << "Can't create GL _context.";
return;
}
_surface.setFormat(_context.format());
_surface.create();
if(!_surface.isValid())
{
qDebug() << "_surface not valid.";
return;
}
if(!_context.makeCurrent(&_surface))
{
qDebug() << "Can't make _context current.";
return;
}
_image = new QImage("/home/mmt/Desktop/Projects/OpenGLOffscreen/sono.jpg");
_fbo = new QOpenGLFramebufferObject(_image->size());
_context.functions()->glViewport(0, 0, _image->width(), _image->height());
fun = new QOpenGLFunctions_3_3_Core();
if(!fun->initializeOpenGLFunctions())
{
qDebug() << "Can't init GL functions.";
return;
}
_shader = new QOpenGLShaderProgram(&_context);
loadChars();
}
bool OpenGLHandler::prepareShader(QString vertexShader, QString fragmentShader)
{
if(!_shader->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex, vertexShader))
{
qDebug() << "Can't add vertex shader.";
return false;
}
if(!_shader->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShader))
{
qDebug() << "Can't add fragment shader.";
return {};
}
if(!_shader->link())
{
qDebug() << "Can't link program.";
return false;
}
if(!_shader->bind())
{
qDebug() << "Can't bind program.";
return false;
}
return true;
}
bool OpenGLHandler::prepareTexture(const QImage& image)
{
_texture.setData(image);
_texture.bind();
if(!_texture.isBound())
{
qDebug() << "Texture not bound.";
return false;
}
return true;
}
bool OpenGLHandler::prepareCoords(QOpenGLBuffer vertexBuf, QOpenGLBuffer indexBuf)
{
VertexData vertices[] =
{
{{ -0.5f, +0.5f }, { 0.0f, 0.0f }}, //top-left
{{ +0.5f, +0.5f }, { 1.0f, 0.0f }}, //top-right
{{ -0.5f, -0.5f }, { 0.0f, 1.0f }}, //bottom-left
{{ +0.5f, -0.5f }, { 1.0f, 1.0f }} //bottom-right
//{{ -0.5f, +0.5f }, { 0.0f, 0.0f }}, //top-left
//{{ +0.5f, +0.5f }, { 1.0f, 0.0f }}, //top-right
//{{ -0.5f, -0.5f }, { 0.0f, 1.0f }}, //bottom-left
//{{ +0.5f, -0.5f }, { 1.0f, 1.0f }} //bottom-right
};
GLuint indices[] =
{
0, 1, 2, 3
};
if(!vertexBuf.create())
{
qDebug() << "Can't create vertex buffer.";
return {};
}
if(!indexBuf.create())
{
qDebug() << "Can't create index buffer.";
return {};
}
if(!vertexBuf.bind())
{
qDebug() << "Can't bind vertex buffer.";
return {};
}
vertexBuf.allocate(vertices, 4 * sizeof(VertexData));
if(!indexBuf.bind())
{
qDebug() << "Can't bind index buffer.";
return {};
}
indexBuf.allocate(indices, 4 * sizeof(GLuint));
return true;
}
void OpenGLHandler::loadChars()
{
if(FT_Init_FreeType(&_ft))
{
qDebug() << "ERROR::FREETYPE: Could not init FreeType Library";
}
if(FT_New_Face(_ft, "/home/mmt/.fonts/Roboto-Black.ttf", 0, &_face))
{
qDebug() << "ERROR::FREETYPE: Failed to load font";
}
FT_Set_Pixel_Sizes(_face, 0, 48);
if(FT_Load_Char(_face, 'X', FT_LOAD_RENDER))
{
qDebug() << "ERROR::FREETYTPE: Failed to load Glyph";
}
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); //disable byte-alignment restriction
int i = 0;
for(unsigned char c = 0; c < 128; c++)
{
//load character glyph
if(FT_Load_Char(_face, c, FT_LOAD_RENDER))
{
qDebug() << "ERROR::FREETYTPE: Failed to load Glyph\n";
continue;
}
//// generate texture
unsigned int texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(
GL_TEXTURE_2D,
0,
GL_RED,
_face->glyph->bitmap.width,
_face->glyph->bitmap.rows,
0,
GL_RED,
GL_UNSIGNED_BYTE,
_face->glyph->bitmap.buffer
);
//qDebug() << _face->glyph->bitmap.palette_mode;
//QImage chImage(_face->glyph->bitmap.buffer, _face->glyph->bitmap.width,
//_face->glyph->bitmap.rows,
//QImage::Format::Format_Grayscale8);
//chImage.save("/home/mmt/Desktop/chr/" + static_cast<QString>(i++) + ".png");
//// set texture options
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//now store character for later use
Character character = {
texture,
glm::ivec2(_face->glyph->bitmap.width, _face->glyph->bitmap.rows),
glm::ivec2(_face->glyph->bitmap_left, _face->glyph->bitmap_top),
_face->glyph->advance.x
};
_characters.insert(c, character);
}
glBindTexture(GL_TEXTURE_2D, 0);
FT_Done_Face(_face);
FT_Done_FreeType(_ft);
}
void OpenGLHandler::processText()
{
QString vertexShadre =
"#version 330 core\n"
"layout (location = 4) in vec4 vertex;"
"out vec2 TexCoords;"
"uniform mat4 projection;"
"void main()"
"{"
" gl_Position = projection * vec4(vertex.xy, 0.0, 1.0);"
" TexCoords.x = vertex.z;"
" TexCoords.y = vertex.w;"
"}";
QString fragShadre =
"#version 330 core\n"
"in vec2 TexCoords;"
"out vec4 color;"
"uniform sampler2D text;"
"uniform vec3 textColor;"
"void main()"
"{"
" vec4 sampled = vec4(1.0, 1.0, 1.0, texture(text, TexCoords).r);"
" color = vec4(textColor, 1.00) * sampled;"
"}";
prepareShader(vertexShadre, fragShadre);
//_shader->link();
//_shader->bind();
//fun->glEnable(GL_CULL_FACE);
fun->glEnable(GL_BLEND);
//glBlendFunc(GL_ONE, GL_ZERO);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
QMatrix4x4 qProjection;
QRect temp(0.0f, static_cast<float>(320), 0.0f, static_cast<float>(480));
qProjection.ortho(temp);
_shader->setUniformValueArray(_shader->uniformLocation("projection"), &qProjection, 1);
fun->glGenVertexArrays(1, &chVAO);
fun->glGenBuffers(1, &chVBO);
fun->glBindVertexArray(chVAO);
fun->glBindBuffer(GL_ARRAY_BUFFER, chVBO);
fun->glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4, NULL, GL_DYNAMIC_DRAW);
fun->glEnableVertexAttribArray(4);
fun->glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);
fun->glBindBuffer(GL_ARRAY_BUFFER, 0);
fun->glBindVertexArray(0);
RenderText("This is sample text", -0.8f, -.8f, .003f, glm::vec3(0.5, 0.8f, 0.2f));
RenderText("(C) LearnOpenGL.com", -0.5f, 0.00f, 0.005f, glm::vec3(0.3, 0.7f, 0.9f));
//glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
//-------------------------------------------------------------------------------
//glfwSwapBuffers(_window);
//glfwPollEvents();
auto log = _shader->log();
if(log != "")
{
qDebug() << "log : " << log;
}
fun->glDeleteVertexArrays(1, &chVAO);
fun->glDeleteBuffers(1, &chVBO);
_shader->removeAllShaders();
fun->glDisable(GL_BLEND);
glDisable(GL_CULL_FACE);
}
void OpenGLHandler::RenderText(std::string text, float x, float y, float scale, glm::vec3 color)
{
//activate corresponding render state
_shader->setUniformValue(_shader->uniformLocation("textColor"), color.x, color.y, color.z);
glActiveTexture(GL_TEXTURE0);
fun->glBindVertexArray(chVAO);
//iterate through all characters
std::string::const_iterator c;
for(c = text.begin(); c != text.end(); c++)
{
//qDebug() << "here";
Character ch = _characters[*c];
float xpos = x + ch.Bearing.x * scale;
float ypos = y - (ch.Size.y - ch.Bearing.y) * scale;
//qDebug() << "xpos = " << xpos;
float w = ch.Size.x * scale;
float h = ch.Size.y * scale;
//qDebug() << ypos + h;
//update VBO for each character
float vertices[6][4] = {
{ xpos, ypos + h, 0.0f, 0.0f },
{ xpos, ypos, 0.0f, 1.0f },
{ xpos + w, ypos, 1.0f, 1.0f },
{ xpos, ypos + h, 0.0f, 0.0f },
{ xpos + w, ypos, 1.0f, 1.0f },
{ xpos + w, ypos + h, 1.0f, 0.0f }
};
//render glyph texture over quad
glBindTexture(GL_TEXTURE_2D, ch.TextureID);
//update content of VBO memory
fun->glBindBuffer(GL_ARRAY_BUFFER, chVBO);
fun->glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); //be sure to use
//glBufferSubData and not
//glBufferData
fun->glBindBuffer(GL_ARRAY_BUFFER, 0);
//render quad
glDrawArrays(GL_TRIANGLES, 0, 6);
//now advance cursors for next glyph (note that advance is number of 1/64 pixels)
x += (ch.Advance >> 6) * scale; //bitshift by 6 to get value in pixels (2^6 = 64 (divide
//amount of 1/64th pixels by 64 to get amount of pixels))
}
fun->glBindVertexArray(0);
glBindTexture(GL_TEXTURE_2D, 0);
}
bool OpenGLHandler::prepareCoords2(QOpenGLBuffer vertexBuf, QOpenGLBuffer indexBuf)
{
VertexData vertices[] =
{
{{ -1.0f, +1.0f }, { 0.0f, 1.0f }}, //top-left
{{ +1.0f, +1.0f }, { 1.0f, 1.0f }}, //top-right
{{ -1.0f, -1.0f }, { 0.0f, 0.0f }}, //bottom-left
{{ +1.0f, -1.0f }, { 1.0f, 0.0f }} //bottom-right
};
GLuint indices[] =
{
0, 1, 2, 3
};
if(!vertexBuf.create())
{
qDebug() << "Can't create vertex buffer.";
return {};
}
if(!indexBuf.create())
{
qDebug() << "Can't create index buffer.";
return {};
}
if(!vertexBuf.bind())
{
qDebug() << "Can't bind vertex buffer.";
return {};
}
vertexBuf.allocate(vertices, 4 * sizeof(VertexData));
if(!indexBuf.bind())
{
qDebug() << "Can't bind index buffer.";
return {};
}
indexBuf.allocate(indices, 4 * sizeof(GLuint));
return true;
}
QString OpenGLHandler::getImage(QImage img)
{
QByteArray byteArray;
QBuffer buffer(&byteArray);
buffer.open(QIODevice::WriteOnly);
img.save(&buffer, "png");
//save image data in string
QString image("data:image/png;base64,");
image.append(QString::fromLatin1(byteArray.toBase64().data()));
return image;
}
OpenGLHandler::~OpenGLHandler()
{
delete _image;
delete _fbo;
delete _shader;
}
void OpenGLHandler::processImage(const QImage& image,
const QString& vertexShader,
const QString& fragmentShader,
const QString& textureVar,
const QString& vertexPosVar,
const QString& textureCoordVar)
{
//fun->glEnable(GL_BLEND);
bool a;
QOpenGLBuffer vertexBuf(QOpenGLBuffer::VertexBuffer);
QOpenGLBuffer indexBuf(QOpenGLBuffer::IndexBuffer);
a = prepareShader(vertexShader, fragmentShader);
a = prepareTexture(image);
a = prepareCoords(vertexBuf, indexBuf);
int offset = 0;
_shader->enableAttributeArray(vertexPosVar.toLatin1().data());
_shader->setAttributeBuffer(vertexPosVar.toLatin1().data(), GL_FLOAT, offset, 2,
sizeof(VertexData));
offset += sizeof(QVector2D);
_shader->enableAttributeArray(textureCoordVar.toLatin1().data());
_shader->setAttributeBuffer(textureCoordVar.toLatin1().data(), GL_FLOAT, offset, 2,
sizeof(VertexData));
_shader->setUniformValue(textureVar.toLatin1().data(), 0);
fun->glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, Q_NULLPTR);
_shader->disableAttributeArray(vertexPosVar.toLatin1().data());
_shader->disableAttributeArray(textureCoordVar.toLatin1().data());
_shader->disableAttributeArray(textureVar.toLatin1().data());
_shader->removeAllShaders();
}
void OpenGLHandler::flipImage()
{
QString textureVar = "texture";
QString vertexPosVar = "aPosition";
QString textureCoordVar = "aTexCoord";
QString flipVertexShader =
"attribute vec4 aPosition;\n"
"attribute vec2 aTexCoord;\n"
"varying vec2 vTexCoord;\n"
"void main()\n"
"{\n"
" gl_Position = aPosition;\n"
" vTexCoord.x = -aTexCoord.x;\n"
" vTexCoord.y = aTexCoord.y;\n"
"}";
QString flipFragmentShader =
"uniform sampler2D texture;\n"
"varying vec2 vTexCoord;\n"
"void main()\n"
"{\n"
" gl_FragColor = texture2D(texture, vTexCoord);\n"
"}";
prepareShader(flipVertexShader, "");
QOpenGLBuffer vertexBuf(QOpenGLBuffer::VertexBuffer);
QOpenGLBuffer indexBuf(QOpenGLBuffer::IndexBuffer);
prepareCoords2(vertexBuf, indexBuf);
int offset = 0;
_shader->enableAttributeArray(vertexPosVar.toLatin1().data());
_shader->setAttributeBuffer(vertexPosVar.toLatin1().data(), GL_FLOAT, offset, 2,
sizeof(VertexData));
offset += sizeof(QVector2D);
_shader->enableAttributeArray(textureCoordVar.toLatin1().data());
_shader->setAttributeBuffer(textureCoordVar.toLatin1().data(), GL_FLOAT, offset, 2,
sizeof(VertexData));
_shader->setUniformValue(textureVar.toLatin1().data(), 0);
fun->glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, Q_NULLPTR);
_shader->disableAttributeArray(vertexPosVar.toLatin1().data());
_shader->disableAttributeArray(textureCoordVar.toLatin1().data());
_shader->disableAttributeArray(textureVar.toLatin1().data());
_shader->removeAllShaders();
}
void OpenGLHandler::run()
{
//fun->glClearColor(0, 1, 1, 1);
//fun->glClear(GL_COLOR_BUFFER_BIT);
processImage(*_image, vertexShader, fragmentShader, "texture", "aPosition",
"aTexCoord");
processText();
//flipImage();
auto ret = _fbo->toImage(true);
//auto address = getImage(ret);
ret.save("/home/mmt/Desktop/test.png");
}

90
OpenGLHandler.h

@ -0,0 +1,90 @@
#ifndef OPENGLHANDLER_H
#define OPENGLHANDLER_H
#include <QtCore>
#include <QImage>
#include <QOpenGLContext>
#include <QOffscreenSurface>
#include <QOpenGLFramebufferObject>
#include <QOpenGLShaderProgram>
#include <QOpenGLTexture>
#include <QOpenGLBuffer>
#include <ft2build.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <QtGui/QOpenGLFunctions_3_3_Core>
#include FT_FREETYPE_H
struct VertexData
{
QVector2D position;
QVector2D texCoord;
};
struct Character {
unsigned int TextureID; //ID handle of the glyph texture
glm::ivec2 Size; //Size of glyph
glm::ivec2 Bearing; //Offset from baseline to left/top of glyph
long Advance; //Offset to advance to next glyph
};
class OpenGLHandler
{
public:
OpenGLHandler();
~OpenGLHandler();
void run();
void processImage(const QImage& image,
const QString& vertexShader,
const QString& fragmentShader,
const QString& textureVar,
const QString& vertexPosVar,
const QString& textureCoordVar);
private:
QOpenGLFunctions_3_3_Core* fun;
QOpenGLContext _context;
QOffscreenSurface _surface;
QOpenGLFramebufferObject* _fbo;
QImage* _image;
QOpenGLShaderProgram* _shader;
QOpenGLTexture _texture;
FT_Library _ft;
FT_Face _face;
QMap<char, Character> _characters;
QString vertexShader =
"attribute vec4 aPosition;\n"
"attribute vec2 aTexCoord;\n"
"varying vec2 vTexCoord;\n"
"void main()\n"
"{\n"
" gl_Position = aPosition;\n"
" vTexCoord = aTexCoord;\n"
"}";
QString fragmentShader =
"uniform sampler2D texture;\n"
"varying vec2 vTexCoord;\n"
"void main()\n"
"{\n"
" gl_FragColor = texture2D(texture, vTexCoord);\n"
"}";
unsigned int chVAO, chVBO;
bool prepareShader(QString vertexShader, QString fragmentShader);
bool prepareTexture(const QImage& image);
bool prepareCoords(QOpenGLBuffer vertexBuf, QOpenGLBuffer indexBuf);
void loadChars();
void processText();
void RenderText(std::string text, float x, float y, float scale, glm::vec3 color);
bool prepareCoords2(QOpenGLBuffer vertexBuf, QOpenGLBuffer indexBuf);
void flipImage();
QString getImage(QImage img);
};
#endif //OPENGLHANDLER_H

38
OpenGLOffscreen.pro

@ -0,0 +1,38 @@
QT += quick
CONFIG += c++11
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Refer to the documentation for the
# deprecated API to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
OpenGLHandler.cpp \
main.cpp
RESOURCES += qml.qrc
# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =
# Additional import path used to resolve QML modules just for Qt Quick Designer
QML_DESIGNER_IMPORT_PATH =
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
HEADERS += \
OpenGLHandler.h
unix|win32: LIBS += -lfreetype
unix|win32: LIBS += -lglfw

335
OpenGLOffscreen.pro.user

@ -0,0 +1,335 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.10.1, 2021-05-18T14:05:05. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{b555296d-4153-4375-9ee0-d02c6b22be92}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap">
<valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey"/>
<value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.13.2 GCC 64bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.13.2 GCC 64bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5132.gcc_64_kit</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/mmt/Desktop/Projects/build-OpenGLOffscreen-Desktop_Qt_5_13_2_GCC_64bit-Debug</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/mmt/Desktop/Projects/build-OpenGLOffscreen-Desktop_Qt_5_13_2_GCC_64bit-Release</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">true</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/mmt/Desktop/Projects/build-OpenGLOffscreen-Desktop_Qt_5_13_2_GCC_64bit-Profile</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">true</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
<value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Profile</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy Configuration</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
<valuelist type="QVariantList" key="Analyzer.Perf.Events">
<value type="QString">cpu-cycles</value>
</valuelist>
<valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
<value type="int" key="Analyzer.Perf.Frequency">250</value>
<value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Perf.StackSize">4096</value>
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
<value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
<value type="int">0</value>
<value type="int">1</value>
<value type="int">2</value>
<value type="int">3</value>
<value type="int">4</value>
<value type="int">5</value>
<value type="int">6</value>
<value type="int">7</value>
<value type="int">8</value>
<value type="int">9</value>
<value type="int">10</value>
<value type="int">11</value>
<value type="int">12</value>
<value type="int">13</value>
<value type="int">14</value>
</valuelist>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">OpenGLOffscreen</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/mmt/Desktop/Projects/OpenGLOffscreen/OpenGLOffscreen.pro</value>
<value type="QString" key="RunConfiguration.Arguments"></value>
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory"></value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">/home/mmt/Desktop/Projects/build-OpenGLOffscreen-Desktop_Qt_5_13_2_GCC_64bit-Debug</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="int">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">22</value>
</data>
<data>
<variable>Version</variable>
<value type="int">22</value>
</data>
</qtcreator>

27
main.cpp

@ -0,0 +1,27 @@
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "OpenGLHandler.h"
int main(int argc, char* argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject* obj, const QUrl& objUrl) {
if(!obj && url == objUrl)
{
QCoreApplication::exit(-1);
}
}, Qt::QueuedConnection);
engine.load(url);
OpenGLHandler op;
op.run();
return app.exec();
}

9
main.qml

@ -0,0 +1,9 @@
import QtQuick 2.13
import QtQuick.Window 2.13
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
}

5
qml.qrc

@ -0,0 +1,5 @@
<RCC>
<qresource prefix="/">
<file>main.qml</file>
</qresource>
</RCC>

BIN
sono.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Loading…
Cancel
Save