Минимальный закадровый рендеринг OpenGL с использованием QtC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Минимальный закадровый рендеринг OpenGL с использованием Qt

Сообщение Anonymous »

Я пытаюсь создать простой закадровый рендерер для создания набора файлов изображений с помощью Qt. Существует множество примеров, хотя я не нашел ни одного примера такого рода однократного рендеринга, без цикла и без видимого окна.
Кроме того, Qt предоставляет вам удобные оболочки, и это здорово, но, с другой стороны, становится сложнее следовать примерам, написанным на C++glew+glfw.
Я попробовал использовать это для установки закадрового контекста, и это работает. После создания FBO и рендеринга (как здесь) внутри изображения треугольник не рисуется (

Код: Выделить всё

fbo->ToImage
).
Мой текущий код представляет собой смесь двух:

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char* argv[])
{
QApplication a(argc, argv);

QSurfaceFormat surfaceFormat;
surfaceFormat.setMajorVersion(4);
surfaceFormat.setMinorVersion(3);

QOpenGLContext openGLContext;
openGLContext.setFormat(surfaceFormat);
openGLContext.create();
if(!openGLContext.isValid()) return -1;

QOffscreenSurface surface;
surface.setFormat(surfaceFormat);
surface.create();
if(!surface.isValid()) return -2;

openGLContext.makeCurrent(&surface);

QSize vpSize = QSize(300, 300);

qDebug("Hi");

QOpenGLFramebufferObjectFormat fboFormat;
fboFormat.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
QOpenGLFramebufferObject fbo(vpSize, fboFormat);

fbo.bind();

static const float vertexPositions[] = {
-0.8f, -0.8f, 0.0f,
0.8f, -0.8f, 0.0f,
0.0f,  0.8f, 0.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, 9 * sizeof(float));

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

QOpenGLShaderProgram program;
program.addShaderFromSourceCode(QOpenGLShader::Vertex,
"#version 330\r\n"
"in vec3 position;\n"
"in vec3 color;\n"
"out vec3 fragColor;\n"
"void main() {\n"
"    fragColor = color;\n"
"    gl_Position = vec4(position, 1.0);\n"
"}\n"
);
program.addShaderFromSourceCode(QOpenGLShader::Fragment,
"#version 330\r\n"
"in vec3 fragColor;\n"
"out vec4 color;\n"
"void main() {\n"
"    color = vec4(fragColor, 1.0);\n"
"}\n"
);
program.link();
program.bind();

vertexPositionBuffer.bind();
program.enableAttributeArray("position");
program.setAttributeBuffer("position", GL_FLOAT, 0, 3);

vertexColorBuffer.bind();
program.enableAttributeArray("color");
program.setAttributeBuffer("color", GL_FLOAT, 0, 3);

openGLContext.functions()->glClearColor(0.3f, 0.0f, 0.7f, 1.0f);
openGLContext.functions()->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

openGLContext.functions()->glDrawArrays(GL_TRIANGLES, 0, 3);

program.disableAttributeArray("position");
program.disableAttributeArray("color");

program.release();

fbo.release();

qDebug("FBO released");

QImage im = fbo.toImage();

if (im.save("asd.png")){
qDebug("Image saved!!");
}

a.exec();
}

Как соединить закадровую часть с частью рисунка?


Подробнее здесь: https://stackoverflow.com/questions/593 ... g-using-qt
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»