2012-05-30 79 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

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

相關問題