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"); } } |
顶点着色器无法编译,因为它必须是
1 2 3 4 5 6 | void main() { gl_Position.xy = vertexPosition * 2; gl_Position.z = 0.0; gl_Position.w = 1.0; } |