在调用gllinkProgram()之前,顶点着色器和片段着色器无法编译,

时间:2016-06-18 17:39:13

标签: c++ opengl

顶点着色器和片段着色器都是小苍蝇(文件),小红框出现在蓝​​色背景上。

他们是:

第一个是colorShading.vert

#version 130
in vec2 vertexPosition;
void main(){
gl_Positiion.xy = vertexPosition;
gl_Positiion.z = 0;
gl_Positiion.w = 1;
}

第二个是colorShading.frag

#version 130
out vec3 color;
void main(){
color vec3(1.0, 0.0, 0.0);
}

以下是错误:

Vertex and Fragment shader(s) were not successfully compiled 
before glLinkProgram() was called.  Link failed.
Shaders failed to link!
Enter any key to quit...

我使用控制台使用

输出它
std::vector<GLchar> errorLog(maxLength);
glGetProgramInfoLog(_programID, maxLength, &maxLength, &errorLog[0]);
std::printf("%s\n", &(errorLog[0]));
fatalError("Shaders failed to link!");`

我用来编译着色器的函数在

下面

我将文件路径和shaderID传递给函数,而不是复制和粘贴,方便吗?

    void GLSLProgram::compileShader(const std::string& filePath, GLuint& id)
{
    std::ifstream shaderFile(filePath);
    if (shaderFile.fail()) {
        perror(filePath.c_str());
        fatalError("Failed to Open  " + filePath);
    }
    std::string fileContents = "";
    std::string line;
    while (std::getline(shaderFile, line)) {
        fileContents += line + "\n";
    }
    shaderFile.close();
    const char* contentsPtr = fileContents.c_str();
    glShaderSource(id, 1, &contentsPtr, nullptr);
    glCompileShader(id);
    GLint success = 0;
    glGetShaderiv(id, GL_COMPILE_STATUS, &success);
    if (success = GL_FALSE) {
        GLint maxLength = 0;
        glGetShaderiv(id, GL_INFO_LOG_LENGTH, &maxLength);
        //The maxLength include the NULL character
        std::vector<char> errorLog(maxLength);
        glGetShaderInfoLog(id, maxLength, &maxLength, &errorLog[0]);
        //Exit with failure
        glDeleteShader(id);
        std::printf("%s\n", &(errorLog[0]));
        fatalError(" Shader " +filePath +" failed to compile!");
        return;
    }
 }

我如何解决这个错误?

2 个答案:

答案 0 :(得分:0)

您的代码中至少存在两个问题:

编译代码

检查成功编译的if语句包含赋值,而不是比较:

if (success = GL_FALSE) {

你真正需要的是(不是两个等号):

if (success == GL_FALSE) {

我认识的每个编译器至少会对此发出警告。

<强>着色

在片段着色器中,还有一个=符号缺失:

color vec3(1.0, 0.0, 0.0);

这不是有效的glsl代码。很可能你想分配这种颜色,因此代码应该是

color = vec3(1.0, 0.0, 0.0);

答案 1 :(得分:0)

您的第一个代码示例将gl_Position拼错为gl_Positiion