我想在Qt中使用Qt Creator中的glDrawBuffer
和glReadBuffer
函數。我試着這樣做:在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中使用glDrawBuffer
和glReadBuffer
函數的正確方法是什麼?
謝謝,我用'm_openGL31Functions.initializeOpenGLFunctions()'方法,它工作。爲什麼不在'QOpenGLFunctions_3_1'的構造函數中調用此方法?如果沒有初始化這樣的對象似乎是沒有用的。 –
@DonaldDuck:因爲構造函數可能在有OpenGL上下文之前被調用(考慮具有全局作用域的對象,或者在構件完全設置之前在構造實例時初始化的構件類的成員)。總的來說,構造函數是一個糟糕的地方,無論如何要進行初始化。施工人員只應將機器安裝到位,但應該完成「轉動點火鑰匙」這一事實,當事情實際上放在路上時。 – datenwolf
@DonaldDuck:哦,並且實例可能會在OpenGL上下文之間移動(無論出於何種原因),如果發生這種情況,您必須完全重新初始化函數指針。 – datenwolf