2016-11-19 184 views
0

我想在Qt中使用Qt Creator中的glDrawBufferglReadBuffer函數。我試着這樣做:在Qt中使用glDrawBuffer和glReadBuffer函數

glDrawBuffer(GL_NONE); 
glReadBuffer(GL_NONE); 

此代碼將無法編譯,它給了我鏈接錯誤像這樣的:

main.obj:-1: error: LNK2019: unresolved external symbol [email protected] referenced in function "public: void __thiscall Simple3DWidget::OpenGLWindow::render(void)" ([email protected]@[email protected]@QAEXXZ)

這個錯誤基本上意味着職能中包含的頭文件中聲明,但沒有正確的聯繫。

在網絡上搜索此問題後,我發現我必須使用QOpenGLFunctions_3_1類。我想這兩個代碼:

QOpenGLFunctions_3_1 m_openGL31Functions; 
m_openGL31Functions.glDrawBuffer(GL_NONE); 
m_openGL31Functions.glReadBuffer(GL_NONE); 

和:

QOpenGLFunctions_3_1().glDrawBuffer(GL_NONE); 
QOpenGLFunctions_3_1().glReadBuffer(GL_NONE); 

這兩個代碼編譯正確,但是當我運行該程序,在這兩種情況下,程序崩潰,給了我以下錯誤:

Access violation reading location 0x00000090

奇怪的是,當我給你錯誤的值的指針,我通常得到這個錯誤,但這些代碼包含指針(或可能的功能包含其中產生THI指針在這種情況下,Qt的QOpenGLFunctions_3_1類可能存在錯誤?)。

在Qt中使用glDrawBufferglReadBuffer函數的正確方法是什麼?

回答

1

This error basically means that the functions were declared in an included header file but not correctly linked.

正確。你必須鏈接到OpenGL。 Windows上的opengl32.lib,MacOS上的* nix/Linux上的libGL.so-framework OpenGL

but none of these codes contain pointers (or maybe the functions contain pointers which generate this error, in which case there could be a bug in Qt's QOpenGLFunctions_3_1 class?).

是的,他們這樣做。任何超出特定版本的OpenGL接口都會在運行時加載到函數指針中。這是QOpenGLFunctions類所做的。在正確加載這些指針之前,它們是無效的 - 事實上,取決於OpenGL版本,您正在使用一些可能是有效的,而另一些則不是;這就是爲什麼Qt將OpenGL版本放入類名的原因。

回答下列問題:

  • 方案是否創建一個OpenGL上下文使用?
  • QOpenGLFunctions_ ...實例是否在調用線程上激活了上下文的情況下進行了初始化?
  • QOpenGLFunctions_ ...實例的初始化是否成功?

如果您以「否」或「我不知道」回答以上任何問題,那就是您的問題所在。

+0

謝謝,我用'm_openGL31Functions.initializeOpenGLFunctions()'方法,它工作。爲什麼不在'QOpenGLFunctions_3_1'的構造函數中調用此方法?如果沒有初始化這樣的對象似乎是沒有用的。 –

+0

@DonaldDuck:因爲構造函數可能在有OpenGL上下文之前被調用(考慮具有全局作用域的對象,或者在構件完全設置之前在構造實例時初始化的構件類的成員)。總的來說,構造函數是一個糟糕的地方,無論如何要進行初始化。施工人員只應將機器安裝到位,但應該完成「轉動點火鑰匙」這一事實,當事情實際上放在路上時。 – datenwolf

+0

@DonaldDuck:哦,並且實例可能會在OpenGL上下文之間移動(無論出於何種原因),如果發生這種情況,您必須完全重新初始化函數指針。 – datenwolf