4

最后隔离了我的着色器无法使用它无法编译的问题。

这是我的着色器加载例程。第一部分在着色器中读取:

void GLSLShader::LoadFromFile(GLenum whichShader, const string filename)
{   
    ifstream fp;

    // Attempt to open the shader
    fp.open(filename.c_str(), ios_base::in);

    // If the file exists, load it
    if(fp) 
    {
        // Copy the shader into the buffer
        string buffer(std::istreambuf_iterator<char>(fp), (std::istreambuf_iterator<char>()));

        // Debug output to show full text of shader
        errorLog.writeSuccess("Shader debug: %s", buffer.c_str());

        LoadFromString(whichShader, buffer);
    } 
    else 
    {
        errorLog.writeError("Could not load the shader %s", filename.c_str());
    }
}

将其加载到字符串中后,将其发送以进行加载:

void GLSLShader::LoadFromString(GLenum type, const string source) 
{
    // Create the shader
    GLuint shader = glCreateShader(type);

    // Convert the string
    const char * ptmp = source.c_str();
    glShaderSource(shader, 1, &ptmp, NULL);

    // Compile the shader
    glCompileShader(shader);

    // Check to see if the shader has loaded
    GLint status;
    glGetShaderiv (shader, GL_COMPILE_STATUS, &status);
    if (status == GL_FALSE) {
        GLint infoLogLength;
        glGetShaderiv (shader, GL_INFO_LOG_LENGTH, &infoLogLength);
        GLchar *infoLog= new GLchar[infoLogLength];
        glGetShaderInfoLog (shader, infoLogLength, NULL, infoLog);
        errorLog.writeError("could not compile: %s", infoLog);
        delete [] infoLog;
    }
    _shaders[_totalShaders++]=shader;
}

我得到调试输出“无法编译:”并且错误缓冲区似乎是空的。在过去的 3 天里,这一直让我发疯。有人看到我的错误吗?

以下是非常简单的着色器:

#version 330

layout (location = 0) in vec4 position;
layout (location = 1) in vec4 color;

smooth out vec4 theColor;

void main()
{
    gl_Position = position;
    theColor = color;
}



#version 330

smooth in vec4 theColor;

out vec4 outputColor;

void main()
{
    outputColor = theColor;
}

更新

看起来由于某种原因,内存中着色器的末尾添加了废话。我不确定为什么。我已经尝试将它读入一个 char* 和一个字符串。这是输出:

<-!-> Shader: #version 330

layout (location = 0) in vec4 position;
layout (location = 1) in vec4 color;

smooth out vec4 theColor;

void main()
{
    gl_Position = position;
    theColor = color;
}
n
<-!-> Shader: #version 330

smooth in vec4 theColor;

out vec4 outputColor;

void main()
{
    outputColor = theColor;
}
nts/Resources

注意第一个着色器末尾的“n”和第二个着色器末尾的“nts/Resources”。知道为什么吗?

另一个更新

最后的废话是由最后的一条额外的线引起的。我删除了它,它又恢复了输出正确的着色器文本。编译仍然没有运气。

我在这里不知所措。Superbible 有大量未优化的库,我不需要。Mac 似乎没有一个该死的像样的着色器编译器。我真的不介意它有多简单。它只需要与着色器一起工作。有人有例子吗?

4

1 回答 1

2

您在调用glShaderSource时未提供源数组中每个字符串的长度。因此,假定提供的字符串以空字节 ('\0') 终止。您将文件读入内存的方式不会以额外的空字节终止着色器源。因此,GLSL 编译器会将着色器源的末尾以外的内容读取到随机内存中,并在其中找到……垃圾。

解决方案:添加终止空字节,或提供着色器文本长度参数。

于 2012-07-24T07:28:24.837 回答