diff options
Diffstat (limited to 'source/modules/asura-core/graphics/shader.cpp')
-rw-r--r-- | source/modules/asura-core/graphics/shader.cpp | 97 |
1 files changed, 60 insertions, 37 deletions
diff --git a/source/modules/asura-core/graphics/shader.cpp b/source/modules/asura-core/graphics/shader.cpp index 866c4da..afd10b0 100644 --- a/source/modules/asura-core/graphics/shader.cpp +++ b/source/modules/asura-core/graphics/shader.cpp @@ -21,74 +21,97 @@ namespace AsuraEngine Shader::~Shader() { - if(mVertShader != 0) - glDeleteShader(mVertShader); - if(mFragShader != 0) - glDeleteShader(mFragShader); - if(mProgram != 0) - glDeleteProgram(mProgram); + if(mVertShader) glDeleteShader(mVertShader); + if(mFragShader) glDeleteShader(mFragShader); + if(mProgram) glDeleteProgram(mProgram); } bool Shader::Load(const string& vert, const string& frag) { - GLenum err = GL_NO_ERROR; - GLint success; string warnning = ""; - if (mProgram == 0) + if (!mProgram) { mProgram = glCreateProgram(); - if (mProgram == 0) + if (!mProgram) throw Exception("Cannot create OpenGL shader program."); } - if (mVertShader == 0) + if (!CompileVertexShader(vert, warnning)) { - mVertShader = glCreateShader(GL_VERTEX_SHADER); - if (mVertShader == 0) - throw Exception("Cannot create OpenGL vertex shader."); + throw Exception("Compile vertex shader failed:%s", warnning); } - if (mFragShader == 0) + if (!CompileFragementShader(frag, warnning)) { - mFragShader = glCreateShader(GL_FRAGMENT_SHADER); - if(mFragShader == 0) - throw Exception("Cannot create OpenGL fragment shader."); + throw Exception("Compile fragment shader failed:%s", warnning); } - const GLchar* source; + glAttachShader(mProgram, mVertShader); + glAttachShader(mProgram, mFragShader); + + glLinkProgram(mProgram); + GLint success; + glGetProgramiv(mProgram, GL_LINK_STATUS, &success); + if (success == GL_FALSE) + { + warnning = GetProgramWarnings(); + throw Exception("Link shader program failed:\n%s", warnning.c_str()); + } + + return true; + } + + bool Shader::CompileVertexShader(const string& vert, string& outError) + { + if (!mVertShader) + { + mVertShader = glCreateShader(GL_VERTEX_SHADER); + if (!mVertShader) + { + outError = "Cannot create OpenGL Vertex shader."; + return false; + } + } + + const GLchar* source = vert.c_str(); + GLint success; - // Compile vertex shader. - source = vert.c_str(); glShaderSource(mVertShader, 1, &source, NULL); glCompileShader(mVertShader); glGetShaderiv(mVertShader, GL_COMPILE_STATUS, &success); if (success == GL_FALSE) { - warnning = GetShaderWarnings(mVertShader); - throw Exception("Compile vertex shader failed:\n%s", warnning.c_str()); + outError = GetShaderWarnings(mVertShader); + return false; } - // Compile fragment shader. + return true; + } + + bool Shader::CompileFragementShader(const string& frag, string& outError) + { + if (!mFragShader) + { + mFragShader = glCreateShader(GL_FRAGMENT_SHADER); + if (!mFragShader) + { + outError = "Cannot create OpenGL fragment shader."; + return false; + } + } + + const GLchar* source = frag.c_str(); + GLint success; + source = frag.c_str(); glShaderSource(mFragShader, 1, &source, NULL); glCompileShader(mFragShader); glGetShaderiv(mFragShader, GL_COMPILE_STATUS, &success); if (success == GL_FALSE) { - warnning = GetShaderWarnings(mFragShader); - throw Exception("Compile fragment shader failed:\n%s", warnning.c_str()); - } - - // Link program. - glAttachShader(mProgram, mVertShader); - glAttachShader(mProgram, mFragShader); - glLinkProgram(mProgram); - glGetProgramiv(mProgram, GL_LINK_STATUS, &success); - if (success == GL_FALSE) - { - warnning = GetProgramWarnings(); - throw Exception("Link shader program failed:\n%s", warnning.c_str()); + outError = GetShaderWarnings(mFragShader); + return false; } return true; |