OpenGL-编译着色器时出现问题

OpenGL - Problems getting shaders to compile

本文关键字:问题 编译 OpenGL-      更新时间:2023-10-16

最终解决了我的着色器无法适应编译失败的问题。

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

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;
}

我得到的调试输出"无法编译:"并且错误缓冲区似乎是空的。在过去的三天里,这让我抓狂。有人看到我的错误了吗?

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

#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;
}

更新

由于某种原因,内存中的着色器末尾似乎添加了垃圾。我不知道为什么。我试着把它读成一个字符*和一个字符串。这是输出:

<-!-> 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"。知道为什么吗?

另一个更新

结尾处的垃圾是由于结尾处多了一行字造成的。我删除了它,它又回到了输出正确的着色器文本。编译方面仍然没有运气。

我在这里不知所措。《超级圣经》有大量未经优化的图书馆,我不需要。Mac似乎没有一个像样的着色器编译器。我真的不介意它有多简单。它只需要使用着色器。有人举个例子吗?

您调用glShaderSource时没有提供源数组中每个字符串的长度。因此,假定提供的字符串以空字节("\0")终止。将文件读取到内存中的方式不会使用额外的null字节终止着色器源。因此,GLSL编译器将从着色器源的末尾读取到随机内存中,在那里它会发现…垃圾。

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