OpenGL常犯的錯誤及查錯方法總結

2022-02-03 00:48:31 字數 1911 閱讀 2313

實踐告訴我,opengl程式的除錯是最讓人頭大的,因為完全不知道**錯,在此根據以前爬過的坑,簡單總結一下糾錯方法,希望對後來者有幫助:

1.著色器的編譯檢查

即著色器在語法上能不能通過。

這裡要用到glgetshaderiv()函式,具體用法如下,可以用來檢測編譯狀態的。

int success1 = 0;

glgetshaderiv(vertexshader,gl_compile_status,&success1);

if(!success1)

但有時候明明知道某個著色器編譯沒通過,但就是不知道在哪出錯,這個時候可以用glgetshaderinfolog函式,列印出具體報錯資訊

int success1 = 0;

glgetshaderiv(vertexshader,gl_compile_status,&success1);

if(!success1)

舉個例子,比如fragmentshader這樣寫:

#version 330 core

out vec4 ourcolor;

void main()

就會這樣報錯:

這裡的0:5,的5是行數,這樣就容易找到報錯的位置啦。

2.著色器之間的鏈結檢查

頂點著色器和片元著色器都編譯成功,但其中的linkprogram也可能出現問題,簡單的鏈結問題可以用glgetprogramiv和glgetprograminfolog來找到錯誤。

此外出錯還可能是這個原因:

檢查著色器之間的銜接部分,需要注意著色器之間傳遞的變數名一定要一模一樣,比如頂點著色器輸出out vec4 fragcolor,那麼片元著色器名字一定要一樣in vec4 fragcolor

3.除了基本的編譯錯誤,接下來就是比較難找的地方了, 主要有以下幾點:

檢查自己的api有沒有寫對

opengl的api實在是太多,而且很多很相似,這些api乙個字母寫錯,可能就會導致整個程式有問題。。。。

傳入的uniform名字和著色器的名字一定要相同

我就爬過這個坑,cpp裡寫的是project矩陣,結果頂點著色器裡的名字是projection,最後找了很久

檢查片元著色器

如果想檢查片元著色器是不是可用的的,可以試試直接設定輸出顏色fragcolor=vec4(1.0f,0.0f,0.0f,1.0f), 如果輸出紅色說明是可用的。

vao從vbo中獲取資料

獲取資料時一定要注意vbo中的資料格式和vao中的資料格式是不是吻合的

另外的一些細節

如果是用的vs studio,可以安裝如下文字工具,達到如下顏色效果,幫助自己編碼:

具體方法如下:

1.點選工具---->拓展和更新

CIO常犯的五個錯誤

方圓 e家 市場研究機構的分析師宋兆鵬 表示,it 決策者必須作出有效的企業決策,否則他們就有可能使技術管理過程無效,並造成相反的效果。cio們經常改變 it企業 的結構,以降低成本 改善服務或增加反應速度。正確地設計企業是很必要的 錯誤的設計可能會有損企業的業務關係,甚至會破壞企業文化。以下我們將...

常犯的錯誤 找不到檔案

找不到檔案homework02.jsp 然後去編譯目錄下一看,確實沒有這個檔案,手動匯入即可。或者將target homework07 1.0 snapshot這個檔案直接刪除,重新編譯即可。複製檔案的時候注意 複製完的檔案有的時候idea不會自動編譯 要去檢查 war exploded的outpu...

ACM我個菜鳥寫題常犯的錯誤及經驗

可能爆int,要使用long long或者unsigned long long int128我不會使用 有時候題目資料沒有爆int,但是可能在運算的時候爆int 陣列定義多大的範圍要仔細一點,可能大了就mle,小了就re。有的題目要多組輸入,當你使用vector的時候一定要記得把它clear掉,因為...