1 #include <msp/gl/extensions/arb_fragment_shader.h>
2 #include <msp/gl/extensions/arb_shader_objects.h>
3 #include <msp/gl/extensions/arb_vertex_shader.h>
4 #include <msp/gl/extensions/ext_geometry_shader4.h>
14 Shader::Shader(GLenum t)
19 Shader::Shader(GLenum t, const string &src)
27 void Shader::init(GLenum t)
31 if(t==GL_FRAGMENT_SHADER)
32 static Require _req(ARB_fragment_shader);
33 else if(t==GL_VERTEX_SHADER)
34 static Require _req(ARB_vertex_shader);
35 else if(t==GL_GEOMETRY_SHADER)
36 static Require _req(EXT_geometry_shader4);
38 id = glCreateShader(t);
46 void Shader::source(unsigned count, const char **str, const int *len)
48 glShaderSource(id, count, str, len);
51 void Shader::source(const string &str)
53 source(str.data(), str.size());
56 void Shader::source(const char *str, int len)
58 source(1, &str, &len);
61 void Shader::compile()
64 compiled = get_shader_i(id, GL_COMPILE_STATUS);
66 throw compile_error(get_info_log());
69 string Shader::get_info_log() const
71 GLsizei len = get_shader_i(id, GL_INFO_LOG_LENGTH);
72 char *buf = new char[len+1];
73 glGetShaderInfoLog(id, len+1, &len, buf);
80 VertexShader::VertexShader():
81 Shader(GL_VERTEX_SHADER)
84 VertexShader::VertexShader(const string &src):
85 Shader(GL_VERTEX_SHADER, src)
89 FragmentShader::FragmentShader():
90 Shader(GL_FRAGMENT_SHADER)
93 FragmentShader::FragmentShader(const string &src):
94 Shader(GL_FRAGMENT_SHADER, src)
98 GeometryShader::GeometryShader():
99 Shader(GL_GEOMETRY_SHADER)
102 GeometryShader::GeometryShader(const string &src):
103 Shader(GL_GEOMETRY_SHADER, src)