void Shader::Link(const char *name) { glLinkProgram(program); GLint status; glGetProgramiv(program, GL_LINK_STATUS, &status); if (status != GL_TRUE) { GLSLError(program, true, nullptr); throw string("linking failed for shader: ") + name; } mvp_i = glGetUniformLocation(program, "mvp"); col_i = glGetUniformLocation(program, "col"); camera_i = glGetUniformLocation(program, "camera"); light1_i = glGetUniformLocation(program, "light1"); lightparams1_i = glGetUniformLocation(program, "lightparams1"); bones_i = glGetUniformLocation(program, "bones"); pointscale_i = glGetUniformLocation(program, "pointscale"); glUseProgram(program); for (int i = 0; i < MAX_SAMPLERS; i++) { tex_i[i] = glGetUniformLocation(program, ("tex" + to_string(i)).c_str()); if (tex_i[i] >= 0) glUniform1i(tex_i[i], i); } }
uint CompileGLSLShader(GLenum type, uint program, const GLchar *source, string &err) { uint obj = glCreateShader(type); glShaderSource(obj, 1, &source, NULL); glCompileShader(obj); GLint success; glGetShaderiv(obj, GL_COMPILE_STATUS, &success); if (success) { glAttachShader(program, obj); return obj; } err = GLSLError(obj, false, source); glDeleteShader(obj); return 0; }
string Shader::Compile(const char *name, const char *vscode, const char *pscode) { program = glCreateProgram(); string err; vs = CompileGLSLShader(GL_VERTEX_SHADER, program, vscode, err); if (!vs) return string("couldn't compile vertex shader: ") + name + "\n" + err; ps = CompileGLSLShader(GL_FRAGMENT_SHADER, program, pscode, err); if (!ps) return string("couldn't compile pixel shader: ") + name + "\n" + err; glBindAttribLocation(program, 0, "apos"); glBindAttribLocation(program, 1, "anormal"); glBindAttribLocation(program, 2, "atc"); glBindAttribLocation(program, 3, "acolor"); glBindAttribLocation(program, 4, "aweights"); glBindAttribLocation(program, 5, "aindices"); glLinkProgram(program); GLint status; glGetProgramiv(program, GL_LINK_STATUS, &status); if (status != GL_TRUE) { GLSLError(program, true, NULL); throw string("linking failed for shader: ") + name; } mvp_i = glGetUniformLocation(program, "mvp"); col_i = glGetUniformLocation(program, "col"); camera_i = glGetUniformLocation(program, "camera"); light1_i = glGetUniformLocation(program, "light1"); bones_i = glGetUniformLocation(program, "bones"); glUseProgram(program); for (int i = 0; i < MAX_SAMPLERS; i++) { tex_i[i] = glGetUniformLocation(program, (string("tex") + inttoa(i)).c_str()); if (tex_i[i] >= 0) glUniform1i(tex_i[i], i); } return ""; }