QML下的OpenGL
Posted
技术标签:
【中文标题】QML下的OpenGL【英文标题】:OpenGL under QML 【发布时间】:2014-09-23 21:30:45 【问题描述】:所以我一直在使用 QML 下的 OpenGL,并一直在查看提供的同名示例文件。我有点理解它是如何工作的,但事情是这样的:我试图用我自己非常基本的 Open GL 东西替换示例的 paint() 函数中的 OpenGL 着色器程序。但是我无法在屏幕上看到任何可见的东西。我唯一能改变的是背景的颜色。所以我想知道如何设置视口、相机以及任何需要在屏幕上显示的东西。我在 OpenGL 上有一些(非常生疏的)经验,但过去总是有诸如 freeglut 之类的东西让生活变得更轻松。任何指向正确方向的指针或示例(我可以在 paint() 方法中观察和学习的东西)将不胜感激......
编辑:这就是我在 paint() 方法中的内容:
void QtOpenGLViewRenderer::paint()
// The following two lines fixed the problem
QOpenGLFunctions glFuncs(QOpenGLContext::currentContext());
glFuncs.glUseProgram(0);
glViewport(0, 0, m_viewportSize.width(), m_viewportSize.height());
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClearColor(0.2, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
GLfloat triangle[] =
0.25f, 0.25f, 0.0f,
0.75f, 0.25f, 0.0f,
0.25f, 0.75f, 0.0f
;
GLfloat colors[] =
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f
;
glVertexPointer(3, GL_FLOAT, 0, triangle);
glColorPointer(4, GL_FLOAT, 0, colors);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glShadeModel(GL_SMOOTH);
glDrawArrays(GL_TRIANGLES, 0, 3);
glFlush();
我看到的只是暗红色背景,但没有三角形的迹象。这是为什么呢?
【问题讨论】:
尝试将模型移动到新矩阵中,可能当前矩阵堆栈未处于默认状态。 感谢 mk5!也在想类似的事情。我为模型和投影矩阵添加了负载标识(上面编辑的代码)。然后我尝试沿z轴来回移动三角形;把它变大;等等等等,但它永远不会出现在屏幕上...... 我尝试了发布的代码,它对我来说效果很好。所以有些东西我们在这里看不到。m_viewportSize
是否包含正确的值?它是否使用兼容性上下文? glGetErrors()
是否显示任何错误?
视口宽度和高度符合预期 (320 x 480) 并且 glGetError() 返回 GL_NO_ERROR。奇怪...@RetoKoradi 你在哪个平台上试过这个?
我在 Mac OS 10.9.2 上试过。我将代码复制到使用 GLUT 进行窗口系统集成的 C++ 应用程序中。
【参考方案1】:
为了记录而回答我自己的问题。问题是 Qt 默认情况下需要新的 OpenGL 着色语言 (GLSL) 样式指令。要使旧式 OpenGL 指令正常工作,您需要告诉 Qt 您将使用它们而不是由着色器定义的程序。这是通过发出以下命令来完成的:
QOpenGLFunctions glFuncs(QOpenGLContext::currentContext());
glFuncs.glUseProgram(0);
要使这些工作,您还需要包含以下标题:
#include <QOpenGLFunctions>
#include <QOpenGLContext>
【讨论】:
以上是关于QML下的OpenGL的主要内容,如果未能解决你的问题,请参考以下文章
OpenGL Core Profile 下的 QML 标签崩溃 App