qt opengl 离线渲染, 为啥在windows下正常, ios下image为空白?

蜗牛的信仰 2015-07-22 03:09:35
请问一下, qt opengl 离线渲染, 为啥在windows下正常, ios下image为空白?

#include <QtCore>
#include <QtGui>
#include <QtWidgets>

void nativePainting()
{
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\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\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);

glDrawArrays(GL_TRIANGLES, 0, 3);
}

QImage createImageWithFBO()
{
QSurfaceFormat format;
// format.setMajorVersion(3); ios 下注释
// format.setMinorVersion(3); iOS 下注释

QWindow window;
window.setSurfaceType(QWindow::OpenGLSurface);
window.setFormat(format);
window.create();

QOpenGLContext context;
context.setFormat(format);
if (!context.create())
qFatal("Cannot create the requested OpenGL context!");
context.makeCurrent(&window);

const QRect drawRect(0, 0, 400, 400);
const QSize drawRectSize = drawRect.size();

QOpenGLFramebufferObjectFormat fboFormat;
fboFormat.setSamples(16);
fboFormat.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);

QOpenGLFramebufferObject fbo(drawRectSize, fboFormat);
fbo.bind();

QOpenGLPaintDevice device(drawRectSize);
QPainter painter;
painter.begin(&device);
painter.setRenderHints(QPainter::Antialiasing | QPainter::HighQualityAntialiasing);

painter.fillRect(drawRect, Qt::blue);

painter.drawTiledPixmap(drawRect, QPixmap(":/qt-project.org/qmessagebox/images/qtlogo-64.png"));

painter.setPen(QPen(Qt::green, 5));
painter.setBrush(Qt::red);
painter.drawEllipse(0, 100, 400, 200);
painter.drawEllipse(100, 0, 200, 400);

painter.beginNativePainting();
nativePainting();
painter.endNativePainting();

painter.setPen(QPen(Qt::white, 0));
QFont font;
font.setPointSize(24);
painter.setFont(font);
painter.drawText(drawRect, "Hello FBO", QTextOption(Qt::AlignCenter));

painter.end();

fbo.release();
return fbo.toImage();
}

int main(int argc, char **argv)
{
QApplication app(argc, argv);

QImage targetImage = createImageWithFBO();

QLabel label;
label.setPixmap(QPixmap::fromImage(targetImage));
label.show();
return app.exec();
}
...全文
306 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
彩阳 2015-08-04
  • 打赏
  • 举报
回复
NoNo 所有着色器代码,请以下面文字打头: #ifdef GL_ES precision highp float; #endif
蜗牛的信仰 2015-07-24
  • 打赏
  • 举报
回复
请问下需要如何修改呢? 是修改“#version 330”吗?
引用 1 楼 jiangcaiyang123 的回复:
iOS下不可能使用core profile的着色器,请换成GL_ES的着色器再测试。
彩阳 2015-07-22
  • 打赏
  • 举报
回复
iOS下不可能使用core profile的着色器,请换成GL_ES的着色器再测试。

16,199

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧