2013-02-16 84 views
1

我想在C++中創建一個基本着色器類,但是我有一些GLSL(首次使用它)的問題。GLSL編譯失敗,但沒有錯誤信息

這裏是我的CPP文件:

#include "shader.h" 
#include <iostream> 
#include <fstream> 

shader::shader(){ 
    int status; 

    std::string line, full; 
    std::ifstream fragmentfile("fragment.fs"); 
    if(fragmentfile.is_open()){ 
     while(fragmentfile.good()){ 
      getline(fragmentfile, line); 
      full.append(line + '\n'); 
     } 
     fragmentfile.close(); 
    } 
    static const char* fragment_source = full.c_str(); 

    std::cout << fragment_source << std::endl; 

    program_object = glCreateProgram(); 
    shaderref = glCreateShader(GL_FRAGMENT_SHADER); 

    glShaderSource(shaderref, 1, &fragment_source, NULL); 

    glCompileShader(shaderref); 
    glGetShaderiv(shaderref, GL_COMPILE_STATUS, &status); 
    if(status != GL_TRUE){ 
     std::cout << "The shader could not be compiled\n" << std::endl; 
     char errorlog[500] = {'\0'}; 
     glGetShaderInfoLog(shaderref, 500, 0, errorlog); 
     std::cout << "Error: " << errorlog << std::endl; 
    } 
    else 
     std::cout << "The shader could be compiled\n" << std::endl; 

    glAttachShader(program_object, shaderref); 

    glLinkProgram(program_object); 
    glGetProgramiv(program_object, GL_LINK_STATUS, &status); 
    if(status != GL_TRUE){ 
     std::cout << "The shader could not be linked\n"; 
    } 
    else 
     std::cout << "The shader could be linked\n"; 
} 

fragment.fs:

void main(void) 
{ 
    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); 
} 

運行時輸出就是:

void main(void) 
{ 
    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); 
} 


The shader could not be compiled 

Error: 
The shader could not be linked 

沒有錯誤可言。

操作系統:Linux

好吧,我現在找到了。有趣的閱​​讀API:glGetShaderiv不會改變int狀態「如果產生錯誤」,這裏就是這種情況,我會看看我能找到什麼。

東西真的被竊聽了,在Code :: Blocks中創建了一個新的項目,它魔法般地修復了它。

+0

你是如何編譯和鏈接你的程序的?你做了什麼事? – 2013-02-16 22:51:38

+0

我只是將程序與-lX11和-lGL鏈接到g ++(Code :: Blocks as IDE)。 – xXFlorianXx 2013-02-16 22:58:26

+0

什麼是人們逐行閱讀文件並將它們連接在一起?你有沒有聽說過如何閱讀*整個事物*?還是有一些可怕的教程鼓勵這個垃圾代碼? – 2013-02-16 22:58:54

回答

1

在閱讀文件時(使用while (fragmentfile.good())),您有標準的'off by one'錯誤,它會複製文件的最後一行。所以,你試圖編譯着色器:

void main(void) 
{ 
    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); 
} 
} 

其失敗(但爲什麼你沒有看到在信息日誌有用的錯誤消息,目前還不清楚。)

這是C和一個常見的錯誤C++,在許多地方重複使用。當你有一個循環直到文件結束時讀取一些東西時,你的循環測試應該總是在讀操作上,並且在流標誌上不會被設置,直到操作試圖讀取超過文件:

while(getline(fragmentfile, line)) { 
    full.append(line + '\n'); 
} 

或者,跟隨尼科爾流星錘的建議,將整個文件讀一次:

getline(fragmentfile, full, '\0'); 

這是假設片段程序不包含任何NUL('\0')字節,它可以,如果它不是一個有效的fragement程序。

相關問題