00001
00002 #ifndef _TP_SHADER_PROGRAM_H
00003 #define _TP_SHADER_PROGRAM_H
00004
00005 #include <string>
00006 #include <vector>
00007
00008 #include "GLResource.h"
00009 #include "GL/GLPlatform.h"
00010 #include "GL/GLShaderObject.h"
00011 #include "GL/GLShaderObjectIO.h"
00012
00013
00014 namespace gk {
00015
00016
00017 class GLShaderProgram : public GLResource
00018 {
00019 protected:
00020 std::vector<GLShaderObject *> m_shaders;
00021
00022 GLuint m_name;
00023 bool m_is_linked;
00024 bool m_is_validated;
00025
00026 int make( );
00027
00028 public:
00029
00030 GLShaderProgram( )
00031 :
00032 m_name(0),
00033 m_is_linked(false),
00034 m_is_validated(false)
00035 {}
00036
00037
00038 ~GLShaderProgram( ) {}
00039
00040
00041 int attachShader( GLShaderObject *shader );
00042
00043
00044 int link( );
00045
00046 int validate( );
00047
00048
00049 GLuint name( )
00050 {
00051 return m_name;
00052 }
00053
00054
00055 int createGLResource( );
00056
00057
00058 int releaseGLResource( );
00059 };
00060
00061
00062
00063
00064 class GL2ShaderProgram : public GLShaderProgram
00065 {
00066 public:
00067 GL2ShaderProgram( const std::string& vertex_filename,
00068 const std::string& fragment_filename )
00069 :
00070 GLShaderProgram()
00071 {
00072 attachShader( GLVertexShaderIO::read(vertex_filename, "vertex") );
00073 attachShader( GLFragmentShaderIO::read(fragment_filename, "fragment") );
00074 }
00075
00076 ~GL2ShaderProgram( ) {}
00077 };
00078
00079
00080 #if defined GK_OPENGL3 || defined GK_OPENGL4
00081
00082
00083
00084
00085
00086
00087 class GL3ShaderProgram : public GLShaderProgram
00088 {
00089 public:
00090 GL3ShaderProgram( const std::string& vertex_filename,
00091 const std::string& geometry_filename,
00092 const std::string& fragment_filename )
00093 :
00094 GLShaderProgram()
00095 {
00096 attachShader( GLVertexShaderIO::read(vertex_filename, "vertex") );
00097 attachShader( GLGeometryShaderIO::read(geometry_filename, "geometry") );
00098 attachShader( GLFragmentShaderIO::read(fragment_filename, "fragment") );
00099 }
00100
00101 ~GL3ShaderProgram( ) {}
00102 };
00103 #endif
00104
00105 #ifdef GK_OPENGL4
00106
00107
00108
00109
00110
00111
00112
00113
00114 class GL4ShaderProgram : public GLShaderProgram
00115 {
00116 public:
00117 GL4ShaderProgram( const std::string& vertex_filename,
00118 const std::string& control_filename,
00119 const std::string& evaluation_filename,
00120 const std::string& geometry_filename,
00121 const std::string& fragment_filename )
00122 :
00123 GLShaderProgram()
00124 {
00125 attachShader( GLVertexShaderIO::read(vertex_filename, "vertex") );
00126 attachShader( GLControlShaderIO::read(control_filename, "control") );
00127 attachShader( GLEvaluationShaderIO::read(evaluation_filename, "evaluation") );
00128 attachShader( GLGeometryShaderIO::read(geometry_filename, "geometry") );
00129 attachShader( GLFragmentShaderIO::read(fragment_filename, "fragment") );
00130 }
00131
00132 ~GL4ShaderProgram( ) {}
00133 };
00134 #endif
00135
00136 }
00137
00138 #endif