2013-10-29 11 views
1

注意:glCreateProgram()失敗?

經過挖掘,原來glCreateProgram()一直返回0。一旦我弄清楚了,我會發布修補程序。如果你們知道什麼可能導致它,請發表評論^^

context正確創建。

context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

謝謝。


該文件被正確加載。它保存爲cl.vsh

它加載正常,但在編譯階段失敗。

這是cl.vsh

attribute vec4 position; 
attribute vec3 normal; 

uniform mat4 modelViewProjectionMatrix; 
uniform mat4 modelViewMatrix; 
uniform mat3 normalMatrix; 

uniform float time; 

varying vec3 eyespaceNormal; 
varying vec4 eyespacePosition; 
varying vec3 noiseVector; 


void main() 
{ 

    int i = 0; 
// vec3 translation = vec3(1.0, 1.0, 1.0) * time/20.0; 
// noiseVector = position.xyz + translation; 
//  
// eyespaceNormal = normalMatrix * normal; 
// eyespacePosition = modelViewMatrix * position; 
// gl_Position = modelViewProjectionMatrix * position; 
} 

代碼這是編譯的一部分。 shaderString是cl.vsh

GLint status; 
    const GLchar *source; 

    source = 
     (GLchar *)[shaderString UTF8String]; 
    if (!source) 
    { 
     NSLog(@"Failed to load vertex shader"); 
     return NO; 
    } 

    *shader = glCreateShader(type); 
    glShaderSource(*shader, 1, &source, NULL); 
    glCompileShader(*shader); 

    glGetShaderiv(*shader, GL_COMPILE_STATUS, &status); 

    if (status != GL_TRUE) 
    { 
     GLint logLength; 
     glGetShaderiv(*shader, GL_INFO_LOG_LENGTH, &logLength); 
     if (logLength > 0) 
     { 
      GLchar *log = (GLchar *)malloc(logLength); 
      glGetShaderInfoLog(*shader, logLength, &logLength, log); 
      NSLog(@"Shader compile log:\n%s", log); 
      free(log); 
     } 
    } 

的確切的代碼打印出日誌 _

(lldb) p log 
(GLchar *) $0 = 0x17420000 
(lldb) po log 
[no Objective-C description available] 
(lldb) p *log 
(GLchar) $2 = '\0' 
+0

我看到你叫做'glGetShaderInfoLog(...)',你介意在你的問題中分享輸出嗎? –

+0

完成。其空.....請檢查更新 – Legolas

+0

究竟是什麼時候失敗? (你在什麼時候在調試器中檢查'log')?當我嘗試時,我沒有看到它編譯失敗,如果你有編譯問題,你應該從「Shader compile log」NSLog'語句中看到一些東西。 – rickster

回答

7

一些挖後,我意識到我需要設置我的上下文爲當前上下文。 FML。這是問題

[EAGLContext setCurrentContext:context]; 

現在問題已修復。

+1

錯誤,這應該是一個微不足道的問題,以檢測您的錯誤檢測代碼是否正確編寫。您應在每次調用之後檢查「glGetError(...)」的狀態。你會發現每個人都在生成'GL_INVALID_OPERATION',因爲沒有執行操作的活動上下文。 OpenGL API調用有時會失敗,但不返回狀態碼,但會標記錯誤狀態。因此,當您要確定您的呼叫是否成功時,測試返回值僅爲圖片的一半。 –

+0

啊。好。謝謝。這是一個很好的電話。我會去做。 – Legolas