c – 糾正QOpenGLFunctions的用法

我目前正在使用Qt5 gui模組來訪問OpenGL函式.

然後我發現QOpenGLFunctions很有用,因為:

>它包含OpenGL for Desktop和OpenGL ES,確保我以“便攜”的方式使用OpenGL API.

>我不必擔心包含OpenGL標題,Qt為我做了.

然而,我懷疑使用它的正確方法.

以下行僅列出了我使用此類的三種方式.

我的問題是:有沒有一種使用QOpenGLFunctions的好方法?

繼承自QOpenGLFunctions

Qt官方文件說’從QOpenGLFunctions繼承你的類,並像以前一樣使用glXXXX類.但我不喜歡這樣:

>如果我的類之前需要繼承其他類,我必須進行多重繼承.我不喜歡的東西.即使這樣的情況無論如何都是安全的,這是aestethics ……

>每個glXXXX包裝類都是非const的.我會強制所有使用OpenGL的方法都是非const的.這並沒有太大的意義.是的,當我執行glClear(…)時,OpenGLFunctions類可以合法地為非const,但為什麼我的方法DrawableShape :: render(…)會是?

關於從QOpenGLFunctions繼承.它的建構函式可以接受一個引數:當前的OpenGL上下文.這個引數對我來說似乎非常重要,但沒有Qt文件呼叫這個建構函式.相反,他們讓編譯器選擇無引數建構函式.

將QOpenGLFunctions作為成員

另一個想法應該是將QOpenGLFunctions的例項作為呼叫glXXXXX函式的任何類的成員,或者至少引用一個例項,並從該例項呼叫每個OpenGL函式.

將QOpenGLFunctions作為引數傳遞

對於使用OpenGL的每個函式,呼叫者傳送QOpenGLFunctions.這條路 :

void renderRectangle(QOpenGLFunctions& opengl) const;

但我怎麼能確定這個功能需要它而且這個不會呢?我的意思是原始碼會變得越來越大,我擔心看到接收此引數的類的每個方法的風險……

遵循其他面向物件的包裝庫的相同原則,您可能會考慮第三個選項的一小部分變化.

定義一個表示當前opengl上下文的類,該類也擴充套件了QOpenGLFunctions

class GL : public QOpenGLFunctions{

  QGLContext& context;

  GL(QGLContext& c) : glContext(c){ ... }

};

渲染執行緒將初始化GL的例項,提供其當前上下文,並將其傳遞給需要執行opengl操作的所有渲染例項.通過這種方式,您還可以確保在初始化和使用opengl結構和緩衝區時不會混合多個上下文.

class Visualizer{

 void glInit(GL& gl){ ... } 

 void glPaintOpaque(GL& gl){ ... } 

 void glPaintTranslucent(GL& gl){ ... } 

};

翻譯自:https://stackoverflow.com/questions/24122800/correct-usages-of-qopenglfunctions