我是 Qt 的新手,正在嘗試匯入一些較舊的 C openGL 代碼。我目前正在使用 Qt 6.4。我已將使用 OpenGL 的類子類化為QOpenGlFunctions.
許多glFoo呼叫“有效”,但該類也使用諸如glEnableClientState, glVertexPointer, glNormalPointer, glTexCoordPointer, glDisableClientState, glColor4fv, &之類的呼叫,這些呼叫glMaterialfv會產生諸如undefined reference to __imp_glTextCoordPointer. 查看檔案,“默認”似乎不再支持這些檔案,但似乎使用舊版本QOpenGlFunctions(https://doc-snapshots.qt.io/qt6-dev/qopenglfunctions-1-4QOpenGlFunction_1_4)支持它們.html)。
試圖將我的子類從 更改QOpenGLFunctions為QOpenGLFunctions_1_4抱怨真的只有QOpenGLFunctions_1_4_CoreBackend并且QOpenGLFunctions_1_4_DeprecatedBackend存在,但似乎沒有關于這些的檔案,如果我將子類化為其中之一,我開始看到關于我的建構式的投訴......
我如何實際訪問這些舊版本的類中的函式?
uj5u.com熱心網友回復:
Chris Kawa在Qt 論壇上回答了這個問題,它對我有用!這是他的回答:
OpenGL 3.1 引入了組態檔。核心組態檔不支持這些舊功能,而兼容性組態檔支持。所以首先你必須確保你有一個低于 3.1(不支持組態檔)或 3.1 版本的背景關系,并設定為使用兼容性組態檔。AFAIK Qt 不再支持 OpenGL < 3.1,因此您只有后一種選擇。如果您不確定您擁有什么背景關系,您可以簡單地執行 qDebug() << your_context,它會列印出所有引數,或者您可以查詢它的各個欄位,例如 your_conext->format()->profile()。如果您的背景關系設定不正確,最簡單的方法是在您的應用程式中初始化任何 OpenGL 之前像這樣設定它:
QSurfaceFormat fmt;
fmt.setVersion(3,1);
fmt.setProfile(QSurfaceFormat::CompatibilityProfile);
fmt.setOptions(QSurfaceFormat::DeprecatedFunctions);
QSurfaceFormat::setDefaultFormat(fmt);
當您擁有正確的背景關系時,您可以訪問不推薦使用的函式,如下所示:
QOpenGLFunctions_1_4* funcs = QOpenGLVersionFunctionsFactory::get<QOpenGLFunctions_1_4>(context());
if(funcs)
{
//do OpenGL 1.4. stuff, for example
funcs->glEnableClientState(GL_VERTEX_ARRAY);
}
else
{
// Not a valid context?
}
對于像我這樣業余的人來說context(),QOpenGLWidget::context()QOpenGLContext*
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/528362.html
