2013-11-21 62 views
-1

錯誤:不知道如何解決着色器錯誤?

ERROR: 0:1: 'basicVertex120' : syntax error parse error 

代碼:

#version 120 

attribute vec3 position; 
attribute vec2 texCoord; 

varying vec2 texCoord0; 

uniform mat4 transform; 

void main() 
{ 
    gl_Position = transform * vec4(position, 1.0); 
    texCoord0 = texCoord; 
} 

我已經從這裏的教程如下:http://www.youtube.com/watch?v=8n1GV99FJ2Y&list=PLEETnX-uPtBXP_B2yupUKlflXBznWIlL5&index=11

所有從他的教程代碼在這裏:https://github.com/BennyQBD/3DGameEngine

我不是完全遵循它,但是就着色器類而言,它完全一樣。如果你需要發佈任何其他代碼...請告訴我。

我對OpenGL 2.0+和GLSL仍然很陌生,並試圖弄清楚如何知道哪一行有錯誤。是否有像GL11.glGetError();頂點着色器的東西?

是否有任何工具可以使用或documetation我可以瀏覽以嘗試解決問題?

我真的很想學會自己解決這些問題。我怎樣才能做到這一點?

+2

是的,使用glGetShaderInfoLog(我看到它做到了,儘管在你鏈接的源代碼中)。更重要的是,我沒有看到你要求OpenGL版本的任何地方。我不認爲一個給出glsl 1.1的2.0上下文會有#version指令,但這只是一個猜測,因爲我只使用OpenGL 3.1+。 – Xonar

+0

我在代碼中使用了glGetShaderInfoLog,因爲它沒有提供真正的信息......我認爲它沒用。 - 我正在運行的OpenGL版本是3.0,它確實打印了它......但我沒有包括它。 #版本120等同於OpenGL 2.1,但我不太清楚你的第三句話的含義。 – Zeveso

+0

@Xonar:這其實有點灰色地帶。 GLSL 1.1規範的早期版本。沒有定義'#version'或'#extension'預處理器指令,所以一些早期的實現可能不支持它。但我從來沒有遇到過這個問題。 –

回答

2

當人們嘗試逐行讀取着色器文件而不是一次讀取整個文件時,會發生這種情況非常頻繁。他們經常忘記,當讀取行緩衝文件時,行結束從每行中刪除。因此,所有事情都在第一行結束,預處理器認爲整個着色器是一個很長的#version指令。

如果你逐字按照該代碼,這應該不是一個問題,但你永遠不知道。

我會考慮從GL查詢着色器串回來,看到它是什麼實際上解析,以及編譯器日誌:

GLsizei src_len, 
     log_len; 

glGetShaderiv (shader, GL_INFO_LOG_LENGTH,  &log_len); 
glGetShaderiv (shader, GL_SHADER_SOURCE_LENGTH, &src_len); 

GLchar* src_str = calloc (src_len + 1, sizeof (GLchar)); 
GLchar* log_str = calloc (log_len + 1, sizeof (GLchar)); 

glGetShaderInfoLog (shader, log_len, NULL, log_str); 
glGetShaderSource (shader, src_len, NULL, src_str); 

printf ("Shader %d\n",  shader); 
printf (" >> Info: %s\n", log_str); 
printf (" >> Source: %s\n", src_str); 

free (log_str); 
free (src_str); 

我意識到這是寫在C;我不熟悉Java綁定,但一般過程是相同的。

+0

我現在不能好好看看它,所以我明天就會這樣做。但是,我會說這個。當我請求着色器源代碼時,使用'glGetShaderSource',我得到的長度爲18,源代碼如下所示:「basicVertex120.vs」,這讓我覺得有些代碼是非常錯誤的,因爲這是名字,而不是源代碼。就像我說的,生病必須回到你身邊。 - 由於我還沒有嘗試解決您的帖子後的問題。 – Zeveso

相關問題