2013-07-04 44 views
0

我正在使用一個來自互聯網的例子,作者說它的工作原理,它看起來合法。使用SDL2和xcode 4.6。我設法創建了一個OpenGL 3.2核心上下文。但不能使用glsl 1.50

因此,我下載了SDL2並在調試中構建了框架。我創建了一個常規的Opengl 2.1應用程序來檢查SDL是否已正確構建,並且可以調試它。

然後我創建一個OpenGL 3.2核心上下文我檢查了主要版本是3和次要2(調用GlGetIntegerv)。

我也用這條線:

SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); 

,我仔細檢查固定管道調用都無用。到現在爲止還挺好。

問題是,當我嘗試使用着色器glsl 1.50。它編譯失敗,並給出一些類似的錯誤(我道歉,我沒有現在前面的錯誤):ERROR 0:2語法錯誤語法錯誤

着色器加載代碼如下所示:

char* filetobuf(char *file) 
{ 
    FILE *fptr; 
    long length; 
    char *buf; 

    fptr = fopen(file, "rb"); /* Open file for reading */ 
    if (!fptr) /* Return NULL on failure */ 
     return NULL; 
    fseek(fptr, 0, SEEK_END); /* Seek to the end of the file */ 
    length = ftell(fptr); /* Find out how many bytes into the file we are */ 
    buf = (char*)malloc(length+1); /* Allocate a buffer for the entire length of the file and a null terminator */ 
    fseek(fptr, 0, SEEK_SET); /* Go back to the beginning of the file */ 
    fread(buf, length, 1, fptr); /* Read the contents of the file in to the buffer */ 
    fclose(fptr); /* Close the file */ 
    buf[length] = 0; /* Null terminator */ 

    return buf; /* Return the buffer */ 
} 

和着色器:

vertex shader 
#version 150 core 
  
uniform mat4 viewMatrix, projMatrix; 
  
in vec4 position; 
in vec3 color; 
  
out vec3 Color; 
  
void main() 
{ 
    Color = color; 
    gl_Position = projMatrix * viewMatrix * position ; 
} 

fragment shader: 
#version 150 core 
  
in vec3 Color; 
out vec4 outputF; 
  
void main() 
{ 
    outputF = vec4(Color,1.0); 
} 

如果我不使用3.2核心方面,我得到 「版本不支持」。但現在不是,所以錯誤一定是別的。

任何線索?

UPDATE 事實上,一些事情是錯上的讀數着色器文件,因爲我剛剛創建了一個const char *與在它寫的全着色器,並通過引用glShaderSource()和現在的工作。有趣的是,我仍然不明白filetobuf()有什麼問題(我應用了Armin修復)。

+0

你可以更具體地瞭解錯誤,錯誤發生在哪一行,如果你刪除代碼的某些部分,它會消失嗎? – 2013-07-04 11:21:23

+0

只要我回家,我會盡快更新信息,並可以嘗試您提出的修正。謝謝 – Ozender

+0

你是否檢查了非法(非ascii)字符的着色器?如果您從網頁複製着色器,則可能是一些unicode字符(使用printf或NSLog檢查它)。如果您使用的是OsX系統,請嘗試導入Foundations框架並使用NSString stringWithContentsOfFile:encoding:NSASCIIStringEncoding –

回答

0

您錯誤地使用了fread()。取而代之的

fread(buf, length, 1, fptr); 

應該

fread(buf, 1, length, fptr); 

這可能不是問題,只要我能看到你讀的功能是任何錯誤的無效,但它仍然是最好按照預期使用庫函數。

雖然我不確定你的代碼的第二部分。發佈更具描述性的錯誤消息將有所幫助。

+0

這對於有效讀取內容沒有任何影響。 – datenwolf

+0

有趣的是,觀察某些人如何通過指出其他人最微不足道的錯誤來迅速減少他們的錯誤,從而讓他們對自己感覺更好。 – 2013-07-04 11:59:59

+0

阿明:我犯了一個錯誤,並刪除了我錯誤的答案。我指出,你的答案也沒有任何財務價值,也不會感覺更好,但也可以做出適當的調整。順便說一句:我沒有downvote(你的答案沒有任何投票)。 – datenwolf

相關問題