有什么毛病我GLSL着色器加载代码?(Is there anything wrong with my

2019-10-28 15:25发布

问题是,着色器(非常简单的,因为我学习的OpenGL)无法在一个看似随机的方式来编译(并随机错误信息*)。 相同的着色器,然而,在大约3或4次尝试编译。 下面是代码:

Shader::Shader(GLenum Type,std::string filename)
{
    shader_type = Type;

    std::ifstream ifs(filename);
    if(!ifs)
        throw(std::runtime_error("File:"+filename+" not opened."));
    std::ostringstream stream;
    stream<<ifs.rdbuf();

    const GLchar* data = stream.str().c_str();

    handle = glCreateShader(shader_type);
    glShaderSource(handle,1,static_cast<const GLchar**>(&data),0);

    glCompileShader(handle);

    int status;
    glGetShaderiv(handle,GL_COMPILE_STATUS,&status);
    if(status == GL_FALSE)
    {
        int loglength;
        glGetShaderiv(handle,GL_INFO_LOG_LENGTH,&loglength);

        auto data = new char[loglength];

        glGetShaderInfoLog(handle,loglength,&loglength,data);

        std::string strdata(data);
        delete [] data;

        throw(std::runtime_error(strdata));
    }
}

请注意,着色器不能在最后丢失换行符,赢得最后的分号后进行额外的空间,并使用制表符代替空格。 (如建议在不同的旧帖子在互联网上!)。

  • 下面是来自同一个顶点着色器这里生产的两个错误信息,而不是在同一时间:

#version 330
in vec2 Position;
uniform mat4 transform;
void main()
{
    gl_Position = transform*vec4(Position,0.0f,1.0f);

}

错误:

0(1) : error C0000: syntax error, unexpected $undefined at token "<undefined>"


0(6) : error C0000: syntax error, unexpected '!', expecting ',' or ')' at token "!"

有时,它只是工作! 它是我的驱动程序有问题? (我使用的是最近302.x稳定的NVIDIA二进制文件的Arch Linux的64位驱动程序,与年龄9600 GSO卡)

PS:该代码按预期工作,每当着色器编译正确,所以我认为这768,16是正确的。 我会很高兴地张贴工作(有时!)例如,作为一个zip文件,如果问题不能从这个发现,有人想看看。

Answer 1:

const GLchar* data = stream.str().c_str();

这不好。 如果你想字符串的数据,你需要将它存储str将返回缓冲区,然后您可以得到一个指向与副本 c_str 。 一旦临时被破坏(在此行结束),该指针将指向内存,你不再有机会获得。

正确的代码是这样的:

std::string dataString = stream.str();
const GLchar *data = reinterpret_cast<GLchar*>(dataString.c_str());


文章来源: Is there anything wrong with my glsl shader loading code?