簡體   English   中英

OpenGL GLSL GLUT沖突

[英]OpenGL GLSL GLUT conflict

好的,我正在嘗試制作一個OpenGL應用程序以使用片段着色器。 我需要使用glUniform將一些變量添加到片段着色器中。

我看過一些看起來像這樣的例子:

static PFNGLSHADERSOURCEARBPROC glShaderSourceARB;

他們有10個這樣的人。 當我把它們放進去時,它說, previous declaration of glShaderSourceARBglShaderSourceARB was declared 'extern' and then later 'static'

當我不放它時,每次使用glShaderSourceARB ,都會得到Undefined Reference to glShaderSourceARBUndefined Reference to glShaderSourceARB

這怎么可能? 它為我兩次聲明而感到生氣,但是如果我刪除1個聲明,它說根本沒有聲明。 有人可以解釋這應該如何工作嗎?

好的,您的問題源於對C存儲和范圍限定符的了解不足。

全局范圍內的static表示:該符號僅對其所在的編譯單元和該編譯單元可見。 其他編譯單元可能具有相同名稱的靜態符號,但是它們也是它們自己的專用符號,並且不會干擾它們。

extern表示,它所指代的符號已在單位的其他位置定義暴露(即不是static )。 您通常在標題中使用它。 雖然當然可以編寫extern static但這通常沒有什么意義。

現在您要做的是引入一個具有static作用域的新全局符號,而標頭已經聲明存在一個同名的非static符號。 並且編譯器告訴您“很抱歉,該名稱已經被使用;但是您的符號與extern聲明不匹配,因此會迷路。”

但是,只有一個extern聲明,而沒有符號的實際定義,鏈接器最后會告訴您:“缺少了一些部分, xyz在哪里,沒有人真正定義它;每個人都在引用它(外部) ,但實際上沒有人提供。”

好的,那么您應該將glShaderSourceARB定義為非靜態的嗎? 沒有!

因為在該符號周圍沒有足夠的符號。 您還必須將其初始化為某種東西。 為此,請使用glXGetProcAddresswglGetProcAddress 您必須為每個符號使用函數名稱來調用它。 並且由於在Windows中函數地址可能取決於活動的OpenGL上下文,因此您必須將這些符號放入線程本地存儲中 ,並在每次調用wglMakeCurrent時將其重新初始化。

您真正應該做的是為自己准備一個圖書館,該圖書館會完成所有繁瑣的工作,將其放入程序中,而不再考慮它。 與GLEW一樣,可以從http://glew.sourceforge.net獲得 –仔細閱讀文檔,按照每個步驟進行操作,然后一切都會正常進行(如果您遵循文檔)。 一個建議:嵌入GLEW以靜態方式簡化程序分發。

顯然,您有一個聲明函數簽名的標頭,但沒有任何鏈接的庫,該庫實際上包含函數(這是undefined reference錯誤)。

在Windows中,該庫不包含着色器函數(僅包含OpenGL 1.1以下的函數),並且某些第三方庫(例如GLEW或GLEE)是必需的。 您還可以看到MiniShader的實現方式(它可以執行GLEW / GLEE的功能,除了它已針對最小的代碼大小進行了優化(例如在4k簡介中)。

在Linux中,僅通過-lGL鏈接-lGL可以幫助與OpenGL庫abd進行鏈接,從而避免了undefined reference s(如果沒有,則也可以使用GLEW)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM