2012-07-18 48 views
0

这应该很简单:我使用QGLWidget来绘制一些OpenGL图形,并且我希望能够在渲染的OpenGL图形上编写一些东西,所以我使用了overpainting作为在QPainter的Qt演示中。QGLWidget - 如何构造一个覆盖的程序

这里是构建我的程序我的两个工作选择:

// This works but it's probably stupid 
paintEvent() 
{ 

    makeCurrent(); 

    glewInit(); 

    loadShaders(); 

    loadTextures(); 

    loadBuffers(); 

    ... actually paint something with openGL ... 

    QPainter painter(this); 

    ... overpainting ... 
} 

------------------------------------------------------------------------------------ 

// This works and may probably be better 
paintEvent() 
{ 

    QGLWidget::paintEvent(event); // Base class call, this calls initializeGL ONCE and then paintGL each time it's needed 

    QPainter painter(this); 

    ... overpainting ... 
} 

initializeGL() 
{ 
    glewInit(); 
} 

paintGL() 
{ 
    loadShaders(); 

    loadTextures(); 

    loadBuffers(); 

    ... actually paint something with openGL ... 
} 

考虑到纹理和着色器不会是始终不变的,是任何这些选项可以接受的(在表演和合理的)?

如果不是:你将如何构造程序?

感谢您的帮助

回答

0
  1. 负载/编译/链接着色器在initializeGL()方法,因为这是相对缓慢的操作(特别是如果它是从磁盘读取)
  2. 负荷纹理的initializeGL()方法

不确定什么是缓冲区,但听起来像它应该在初始化中完成,因为它只做一次。

+0

可以在那里加载glew吗?我没有找到另一个地方加载glew – 2012-07-18 21:11:35

+0

注意:paintEvent被多次提出,不幸的是,似乎将着色器/纹理/缓冲区(VBO)代码移动到initializeGL(仅在上下文更改时调用该代码)会导致应用程序不能很好地呈现 – 2012-07-18 21:13:40

+0

@JohnnyPauling不是。 glew应该是主要的,因为它需要argc/argv从主要() – 2012-07-18 21:15:10