Opengl錯誤:“Error C5145: must write to gl_Position”

寫opengl時,編譯出現了這個錯誤,查了很久都沒有找出問題,網上大部分說的是讀取shader文件的時候出錯了,或者將gl_Position拼錯,或者是沒有給gl_Position賦值。我檢查我的代碼都沒有上面的問題,後來發現是API用錯了。

錯誤代碼:

vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(GL_VERTEX_SHADER, 1, &vsCode, NULL); // 錯誤用法
glCompileShader(vs);

正確代碼:

vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &vsCode, NULL); // 正確用法
glCompileShader(vs);

這個錯誤發生在鏈接階段,即將vertex shader和fragment shader鏈接到着色器程序上的階段。在shader編譯的時候只會檢察語法錯誤,因此像上面的錯誤示例編譯的時候是不會報錯的,因爲vs沒有根本就沒有加載shader代碼,在編譯vs的時候,shader代碼是空的,就不會有語法錯誤,而不會報錯。但是在鏈接的時候,需要檢察一些全局的參數——傳遞數據的參數是否被賦值了沒,其中gl_Position就是將經過頂點着色器轉換後的頂點數據傳遞到片段着色器,因爲頂點着色器沒有代碼,gl_Position就沒有被賦值,這就是我上面報錯的原因。

自己通過查詢和調試,總結出一些導致產生這個錯誤的原因:

1.保證shader代碼的字符串正確。shader代碼從文件中讀取時,需要注意文件的編碼格式,帶標籤的編碼,都會有前綴,會導致錯誤;行尾也是一樣。檢查方法,可以在調用glShaderSource()時,將shader的字符串打印出來。

2.gl_Position拼寫正確,有些錯誤是因爲拼寫成gl_position了。

3.要給gl_Position賦值

4.api調用正確

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章