2013-02-16 91 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程序。

相关问题