實踐告訴我,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掉,因為...