【问题标题】:GLSL Shaders not working on OSX Lion MacBook ProGLSL 着色器不适用于 OSX Lion MacBook Pro
【发布时间】:2012-03-26 16:10:00
【问题描述】:

我有一台运行 OSX Lion 的 MacBook Pro,配备 CoreI5 和 Intel HD 3000 Graphics,我无法在 Xcode 4 中使用基本着色器。我熟悉 Windows 上的 OpenGL 和 GLSL,但对 Mac 不熟悉。我将 GLSL 代码添加到“Mac 上的 Cocoa”中。代码如下:

    - (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];
    }

}

【问题讨论】:

  • 你画的是什么类型的 NSView?简单地清除为 OpenGL 清除颜色是否会给您预期的结果?
  • 您的#version 指令在哪里?它究竟是如何“不工作”的?
  • NSView 是 NSOpenGL 视图。在渲染循环中更改清晰的颜色会产生预期的结果。我尝试添加“#version 120”,但出现编译错误,错误字符串说明:“syntax error #version”。当我说它不起作用时,我的意思是三角形是在 DrawAnObject() 方法中使用 glColor3f 指定的颜色,而不是片段着色器中所述的红色。

标签: macos opengl glsl


【解决方案1】:

这个:

gl_Position = ftransform;

应该是:

gl_Position = ftransform();

您还应该在每个着色器源的开头(在第一行)使用#version 120 指定每个着色器中的 GLSL 版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    相关资源
    最近更新 更多