2012-05-30 58 views
3

我正在运行Mac OS X Lion,我试图编写一个基本的OpenGl程序,但是我的片段着色器不工作。当我不包括它时,我得到了我的黑色三角形,但是当我做这个时,屏幕只是白色。加载它也没有错误。调试这个最好的方法是什么?这里是我的着色器:OpenGL片段着色器没有效果,如何判断错误?

顶点:

#version 120 
attribute vec2 coord2d; 
void main(void) { 
    gl_Position = vec4(coord2d, 0.0, 1.0); 
} 

片段:

#version 120 
void main(void) { 
    gl_FragColor[0] = 1.0; 
    gl_FragColor[1] = 1.0; 
    gl_FragColor[2] = 0.0; 
} 

和代码加载我着色器,我从this tutorial获得。

编辑以添加更多的信息

int init_resources() 
{ 
    GLfloat triangle_vertices[] = { 
     0.0f, 0.8f, 
     -0.8f, -0.8f, 
     0.8f, -0.8f, 
    }; 
    glGenBuffers(1, &vbo_triangle); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo_triangle); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(triangle_vertices), triangle_vertices, GL_STATIC_DRAW); 

    GLint link_ok = GL_FALSE; 
    GLuint vs, fs; 
    if ((vs = create_shader("vertShader.sh", GL_VERTEX_SHADER)) == 0) return 0; 
    if ((fs = create_shader("fragShader.sh", GL_FRAGMENT_SHADER)) == 0) return 0; 

    program = glCreateProgram(); 
    glAttachShader(program, vs); 
    glAttachShader(program, fs); 
    glLinkProgram(program); 
    glGetProgramiv(program, GL_LINK_STATUS, &link_ok); 
    if (!link_ok) { 
     fprintf(stderr, "glLinkProgram:"); 
     print_log(program); 
     return 0; 
    } 

    const char* attribute_name = "coord2d"; 
    attribute_coord2d = glGetAttribLocation(program, attribute_name); 
    if (attribute_coord2d == -1) { 
     fprintf(stderr, "Could not bind attribute %s\n", attribute_name); 
     return 0; 
    } 

    return 1; 
} 

void onDisplay() 
{ 
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT); 

    glUseProgram(program); 
    glEnableVertexAttribArray(attribute_coord2d); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo_triangle); 
    glVertexAttribPointer(
          attribute_coord2d, 
          2,     
          GL_FLOAT,   
          GL_FALSE,   
          0,     
          0     
         ); 

    glDrawArrays(GL_TRIANGLES, 0, 3); 

    glDisableVertexAttribArray(attribute_coord2d); 
    glutSwapBuffers(); 
} 

GLuint create_shader(const char* filename, GLenum type) 
{ 
    const GLchar* source = file_read(filename); 
    if (source == NULL) { 
    fprintf(stderr, "Error opening %s: ", filename); perror(""); 
    return 0; 
    } 
    GLuint res = glCreateShader(type); 

    glShaderSource(res, 1, source, NULL); 
    free((void*)source); 

    glCompileShader(res); 
    GLint compile_ok = GL_FALSE; 
    glGetShaderiv(res, GL_COMPILE_STATUS, &compile_ok); 
    if (compile_ok == GL_FALSE) { 
    fprintf(stderr, "%s:", filename); 
    print_log(res); 
    glDeleteShader(res); 
    return 0; 
    } 

    return res; 
} 
+1

好像你在正确的跟踪错误代码并检查着色器的编译状态,尽管没有看到代码是d如果很难规定别的东西来检查。在OGL中实际进行一些调试需要一点时间,您必须获得大量的样板才能让您的第一个三角形出现。如果你想提出你所拥有的东西,我可能会发现一些东西,但是如果你想自己调试,我可以欣赏。 – Tim

+0

我很感激帮助,我添加了一个我认为是唯一的其他功能。但是,对于像这样的问题,没有类似的调试器吗? –

+1

通常你可以通过调用glGetError找到最坏的东西。还有gdebugger,它是不错的软件,但更多的是检查缓冲区和纹理等内容。它不会明确告诉你为什么屏幕上没有三角形。 – Tim

回答

2

不得不添加gl_FragColor [3] = 1.0;因为我没有设置不透明度。

+5

顺便说一下,不要单独设置这些单独的组件,只需使用'gl_FragColor = vec4(1.0,1.0,0.0,1.0);'。这是GLSL而不是C.它甚至会阻止你的问题,因为给'vec4'分配'vec3'是一个错误,你必须明确地添加第四个组件。 –

+0

适当注意的好点。 –

2

同时你发现你的解决方案,现在看来,但我想给你一个提示,这让我(也相当新的这一切)最近很多,特别是如果你在Mac OS X的工作:

我建议你安装“图形工具的XCode”(可从开发者下载一节),这将帮助你很多开发着色器,特别是:

  • OpenGL着色生成器可以帮助您开发和测试着色器

  • OpenGL Profiler不仅可以帮助您剖析应用程序,还可以查看加载哪些资源等等。您可以设置断点以停止执行(例如在交换之前),然后查看加载的着色器,并修改它在运行时,看到的变化有什么影响

这里是用户指南对OpenGL探查: https://developer.apple.com/library/mac/#documentation/GraphicsImaging/Conceptual/OpenGLProfilerUserGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40006475-CH1-DontLinkElementID_31

希望帮助

+0

太棒了,这些都是我一直在寻找的工具。 –

相关问题