2012-03-26 80 views
0

我有一臺運行OSX Lion的MacBook Pro,使用帶有Intel HD 3000 Graphics的CoreI5,我無法在Xcode 4中使用基本着色器。我熟悉Windows上的OpenGL和GLSL但對Mac來說是新手。我將GLSL代碼添加到「Mac上的可可」中。下面是代碼:GLSL着色器不能在OSX上使用Lion MacBook Pro

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    // Insert code here to initialize your application 

    GLuint vshader = glCreateShader(GL_VERTEX_SHADER); 
    GLuint fshader = glCreateShader(GL_FRAGMENT_SHADER); 


    const GLchar *vShaderSource = "void main() { \ 
    gl_Position = ftransform; }"; 
    glShaderSource(vshader, 1, &vShaderSource, NULL); 
    glCompileShader(vshader); 

    GLint good; 
    glGetShaderiv(vshader, GL_COMPILE_STATUS, &good); 
    if (good == GL_FALSE) 
    { 
     GLint logLength=0; 
     char *logMessage=NULL; 
     glGetShaderiv(vshader, GL_INFO_LOG_LENGTH, &logLength); 
     logMessage = malloc(logLength); 
     glGetShaderInfoLog(vshader, logLength, NULL, logMessage); 
     NSString *errorString = [[NSString alloc] initWithUTF8String:(logMessage)]; 
     NSAlert *alert = [[[NSAlert alloc] init] autorelease]; 
     [alert setMessageText:errorString]; 
     [alert runModal]; 
     free(logMessage); 
     return; 
    } 


    const GLchar *fShaderSource = "void main() { \ 
    vec4 color = vec4(1.0, 0.0, 0.0, 1.0); \ 
    gl_FragColor = color; \ 
    }"; 
    glShaderSource(fshader, 1, &fShaderSource, NULL); 
    glCompileShader(fshader); 
    glGetShaderiv(fshader, GL_COMPILE_STATUS, &good); 
    if (good == GL_FALSE) 
    { 
     GLint logLength=0; 
     char *logMessage=NULL; 
     glGetShaderiv(fshader, GL_INFO_LOG_LENGTH, &logLength); 
     logMessage = malloc(logLength); 
     glGetShaderInfoLog(fshader, logLength, NULL, logMessage); 
     NSString *errorString = [[NSString alloc] initWithUTF8String:(logMessage)]; 
     NSAlert *alert = [[[NSAlert alloc] init] autorelease]; 
     [alert setMessageText:errorString]; 
     [alert runModal]; 
     free(logMessage); 
     return; 
    } 



    program = glCreateProgram(); 
    glAttachShader(program, vshader); 
    glAttachShader(program, fshader); 
    glLinkProgram(program); 
    // Check link status 
    glGetProgramiv(program, GL_LINK_STATUS, &good); 
    if (good == GL_FALSE) 
    {      
     int logLength=0; 
     char *logMessage=NULL; 
     glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength); 
     logMessage = malloc(logLength); 
     glGetProgramInfoLog(program, logLength, NULL, logMessage);  
     NSString *errorString = [[NSString alloc] initWithUTF8String:(logMessage)]; 
     NSAlert *alert = [[[NSAlert alloc] init] autorelease]; 
     [alert setMessageText:errorString]; 
     [alert runModal]; 
     free(logMessage); 
     return; 
    } 

    // Check validate status 
    glValidateProgram(program); 
    glGetProgramiv(program, GL_VALIDATE_STATUS, &good); 
    if (good == GL_FALSE) 
    {      
     int logLength=0; 
     char *logMessage=NULL; 
     glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength); 
     logMessage = malloc(logLength); 
     glGetProgramInfoLog(program, logLength, NULL, logMessage);   
     NSString *errorString = [[NSString alloc] initWithUTF8String:(logMessage)]; 
     NSAlert *alert = [[[NSAlert alloc] init] autorelease]; 
     [alert setMessageText:errorString]; 
     [alert runModal]; 
     free(logMessage); 
     return; 
    } 


    glUseProgram(program); 

    GLenum glError = glGetError(); 
    if (glError) 
    { 
     char *errorMessage = gluErrorString(glError); 
     NSString *errorString = [[NSString alloc] initWithUTF8String:(errorMessage)]; 
     NSAlert *alert = [[[NSAlert alloc] init] autorelease]; 
     [alert setMessageText:errorString]; 
     [alert runModal]; 
    } 


} 

這裏是渲染循環:

static void drawAnObject() 
{ 
    glColor3f(1.0f, 0.85f, 0.35f); 
    glBegin(GL_TRIANGLES); 
    { 
     glVertex3f( 0.0, 0.6, 0.0); 
     glVertex3f(-0.2, -0.3, 0.0); 
     glVertex3f( 0.2, -0.3 ,0.0); 
    } 
    glEnd(); 
} 
-(void)drawRect:(NSRect)bounds 
{ 
    glClearColor(0, 0, 0, 0); 
    glClear(GL_COLOR_BUFFER_BIT); 
    drawAnObject(); 
    glFlush(); 
    GLenum glError = glGetError(); 
    if (glError) 
    { 
     char *errorMessage = gluErrorString(glError); 
     NSString *errorString = [[NSString alloc] initWithUTF8String:(errorMessage)]; 
     NSAlert *alert = [[[NSAlert alloc] init] autorelease]; 
     [alert setMessageText:errorString]; 
     [alert runModal]; 
    } 

} 
+0

你正在繪製什麼類型的NSView?簡單地清除OpenGL清晰顏色會給你預期的結果嗎? – user1118321 2012-03-26 16:13:38

+1

你的'#版本'指令在哪裏?它究竟如何「不工作」? – genpfault 2012-03-26 16:17:54

+0

NSView是NSOpenGL視圖。在渲染循環中更改清晰的顏色可獲得預期的結果。我試着添加「#version 120」,但我得到一個錯誤字符串的編譯錯誤:「syntax error #version」。當我說它不工作時,我的意思是三角形是DrawAnObject()方法中用glColor3f表示的顏色,而不是片段着色器中所述的紅色。 – 2012-03-26 16:35:12

回答

1

此:

gl_Position = ftransform; 

應該是:

gl_Position = ftransform(); 

你還應該指定GLSL版本在每個着色器#version 120,在每個着色器源(第一行)的開頭。