1 /*********************************************************************** 2 created: Wed, 8th Feb 2012 3 author: Lukas E Meindl 4 *************************************************************************/ 5 /*************************************************************************** 6 * Copyright (C) 2004 - 2012 Paul D Turner & The CEGUI Development Team 7 * 8 * Permission is hereby granted, free of charge, to any person obtaining 9 * a copy of this software and associated documentation files (the 10 * "Software"), to deal in the Software without restriction, including 11 * without limitation the rights to use, copy, modify, merge, publish, 12 * distribute, sublicense, and/or sell copies of the Software, and to 13 * permit persons to whom the Software is furnished to do so, subject to 14 * the following conditions: 15 * 16 * The above copyright notice and this permission notice shall be 17 * included in all copies or substantial portions of the Software. 18 * 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 22 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 23 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 24 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 25 * OTHER DEALINGS IN THE SOFTWARE. 26 ***************************************************************************/ 27 #ifndef _CEGUIOpenGL3Shader_h_ 28 #define _CEGUIOpenGL3Shader_h_ 29 30 #include "CEGUI/Exceptions.h" 31 #include "RendererBase.h" 32 #include <string> 33 34 #if defined(_MSC_VER) 35 # pragma warning(push) 36 # pragma warning(disable : 4251) 37 #endif 38 39 // Start of CEGUI namespace section 40 namespace CEGUI 41 { 42 43 class OPENGL_GUIRENDERER_API OpenGL3Shader : 44 public AllocatedObject<OpenGL3Shader> 45 { 46 public: 47 48 /*! 49 \brief 50 Creates and loads shader programs from the two strings supplied to it 51 */ 52 OpenGL3Shader(const std::string& vertex_shader_source, 53 const std::string& fragment_shader_source); 54 55 ~OpenGL3Shader(); 56 57 /*! 58 \brief 59 Bind the shader to the OGL state-machine 60 */ 61 void bind() const; 62 63 /*! 64 \brief 65 Unbind the shader 66 */ 67 void unbind() const; 68 69 /*! 70 \brief 71 Query the location of a vertex attribute inside the shader. 72 */ 73 GLuint getAttribLocation(const std::string &name) const; 74 75 /*! 76 \brief 77 Query the location of a uniform variable inside the shader. 78 */ 79 GLuint getUniformLocation(const std::string &name) const; 80 81 /*! 82 \brief 83 Defines the name of the variable inside the shader which represents the 84 final color for each fragment. 85 */ 86 void bindFragDataLocation(const std::string &name); 87 88 bool isCreatedSuccessfully(); 89 90 void link(); 91 92 private: 93 GLuint compile(GLuint type, const std::string &source); 94 95 void outputShaderLog(GLuint shader); 96 void outputProgramLog(GLuint program); 97 98 std::string d_shaderName; 99 bool d_createdSucessfully; 100 101 GLuint d_vertexShader; 102 GLuint d_fragmentShader; 103 GLuint d_geometryShader; 104 GLuint d_program; 105 }; 106 107 #define STRINGIFY(x) #x 108 #define TOSTRING(x) STRINGIFY(x) 109 #define AT __FILE__ ":" TOSTRING(__LINE__) 110 #define checkGLErrors() getGLErrors(AT) 111 112 /*! 113 \brief 114 Query OpenGL errors and process them in CEGUI 115 */ 116 void getGLErrors(const char *location); 117 118 } 119 120 #endif 121 122