关于opengl:c open gl shader编译失败

c++ open gl shader failed compilation

我试图在cpp中学习gl,并尝试创建一些着色器,以阅读其文档并遵循yt教程。
它只是编译失败。
昨天刚在控制台着色器" filePath"中打印无法编译
今天,它打印出:

ERROR: 0:7: 'gl_position' : undeclared identifier
ERROR: 0:7: 'xy' : field selection requires structure, vector, or matrix on left
hand side
ERROR: 0:7: 'assign' : cannot convert from '2-component vector of highp float'
to 'highp float'
ERROR: 0:8: 'z' : field selection requires structure, vector, or matrix on left
hand side
ERROR: 0:9: 'w' : field selection requires structure, vector, or matrix on left
hand side

着色器着色器/colorShading.vert无法编译
输入任何键以退出...

这是我的着色器源代码:

1
2
3
4
5
6
7
8
9
10
#version 130

in vec2 vertexPosition;

void main()
{
    gl_position.xy = vertexPosition * 2;
    gl_position.z = 0.0;
    gl_position.w = 1.0;
}

///////////////////////////////////////////////// ///////

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include"GLSLProgram.h"
#include"Error.h"

#include <fstream>
#include <vector>

GLSLProgram::GLSLProgram() :_numAttributes(0), _programID(0), _vertexShaderID(0), _fragmentShaderID(0)
{
}


GLSLProgram::~GLSLProgram()
{

}

void GLSLProgram::compileShaders(const std::string& vertexShaderFilePath, const std::string& framgmentShaderFilePath)
{
    _vertexShaderID = glCreateShader(GL_VERTEX_SHADER);
    if (_vertexShaderID == 0)
    {
        fatalError("Vertex shader failed to be created!");
    }

    _fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
    if (_fragmentShaderID == 0)
    {

        fatalError("Fragment shader failed to be created!");
    }



    compileShader(vertexShaderFilePath, _vertexShaderID);
    compileShader(framgmentShaderFilePath, _fragmentShaderID);
}

void GLSLProgram::linkShaders()
{

    // Attach Shaders to Program
    glAttachShader(_programID, _vertexShaderID);
    glAttachShader(_programID, _fragmentShaderID);

    // Link the Program.
    glLinkProgram(_programID);

    GLuint isLinked = 0;
    glGetProgramiv(_programID, GL_LINK_STATUS, (int *)&isLinked);
    if (GL_FALSE == isLinked) {

        GLint maxLength = 0;
        glGetProgramiv(_programID, GL_INFO_LOG_LENGTH, &maxLength);

        std::vector<char> errorLog(maxLength);
        glGetProgramInfoLog(_programID, maxLength, &maxLength, &errorLog[0]);

        glDeleteProgram(_programID);
        glDeleteShader(_vertexShaderID);
        glDeleteShader(_fragmentShaderID);

        std::printf("%s\
"
, &(errorLog[0]));
        fatalError("Shaders failed to link!");

        return;

    }

    glDetachShader(_programID, _vertexShaderID);
    glDetachShader(_programID, _fragmentShaderID);
    glDeleteShader(_vertexShaderID);
    glDeleteShader(_fragmentShaderID);

}

void GLSLProgram::addAttribute(const std::string& attributeName)
{
    glBindAttribLocation(_programID, _numAttributes++, attributeName.c_str());
}

void GLSLProgram::use()
{
    glUseProgram(_programID);
    for (int i = 0; i < _numAttributes; i++)
    {
        glEnableVertexAttribArray(i);
    }
}

void GLSLProgram::unuse()
{
    glUseProgram(0);
    for (int i = 0; i < _numAttributes; i++)
    {
        glDisableVertexAttribArray(i);
    }
}

void GLSLProgram::compileShader(const std::string & filePath, GLuint& id)
{
    std::ifstream fileptr(filePath);
    if (fileptr.fail()) {
        // Not sold on this
        perror(filePath.c_str());
        fatalError("Failed to Open" + filePath);
    }

    std::string fileContents ="";
    std::string line;

    while (std::getline(fileptr, line))
    {
        fileContents += line +"\
"
;
    }

    fileptr.close();

    // This is weird
    const GLchar * contentsPtr = fileContents.c_str();
    glShaderSource(id, 1, &contentsPtr, 0);

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

        std::vector<GLchar> errorLog(maxLength);
        glGetShaderInfoLog(id, maxLength, &maxLength, &errorLog[0]);

        glDeleteShader(id);

        std::printf("%s\
"
, &(errorLog[0]));
        fatalError("Shader" + filePath +" failed to Compile");
    }
}


顶点着色器无法编译,因为它必须是gl_Position而不是gl_Position。 GLSL区分大小写。请参见顶点着色器-输出:

1
2
3
4
5
6
void main()
{
    gl_Position.xy = vertexPosition * 2;
    gl_Position.z = 0.0;
    gl_Position.w = 1.0;
}