--- /dev/null
+#ifndef MSP_GL_SHADER_H_
+#define MSP_GL_SHADER_H_
+
+#include <string>
+#include "gl.h"
+
+namespace Msp {
+namespace GL {
+
+/**
+A single shader stage. Shaders must be attached to a Program to be used.
+
+This class can't be instantiated directly. Use one of the VertexShader and
+FragmentShader classes to create Shaders.
+*/
+class Shader
+{
+private:
+ unsigned id;
+ bool compiled;
+
+protected:
+ Shader(GLenum t);
+ Shader(GLenum t, const std::string &);
+private:
+ void init(GLenum);
+public:
+ virtual ~Shader();
+
+ void source(unsigned count, const char **str, const int *len);
+ void source(const std::string &str);
+ void source(const char *str, int len);
+ void compile();
+ unsigned get_id() const { return id; }
+ bool is_compiled() const { return compiled; }
+ std::string get_info_log() const;
+};
+
+
+class VertexShader: public Shader
+{
+public:
+ VertexShader();
+ VertexShader(const std::string &);
+};
+
+
+class FragmentShader: public Shader
+{
+public:
+ FragmentShader();
+ FragmentShader(const std::string &);
+};
+
+
+class GeometryShader: public Shader
+{
+public:
+ GeometryShader();
+ GeometryShader(const std::string &);
+};
+
+} // namespace GL
+} // namespace Msp
+
+#endif