From 4e3efa239c9bcb5dd26b4ad9a4d43d4d6a266e6f Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 18 Dec 2009 13:31:07 +0100 Subject: Use multi-pass rendering with seperate ambient and light shaders --- src/Shader.cpp | 60 ++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 14 deletions(-) (limited to 'src/Shader.cpp') diff --git a/src/Shader.cpp b/src/Shader.cpp index 420b6c6..545d193 100644 --- a/src/Shader.cpp +++ b/src/Shader.cpp @@ -18,6 +18,7 @@ */ #include "Shader.h" + #include #include #include @@ -25,8 +26,9 @@ namespace Zoom { -bool Shader::loadProgram(const std::string &vertexShader, const std::string &fragmentShader) { +boost::shared_ptr Shader::load(const std::string &vertexShader, const std::string &fragmentShader) { GLhandleARB program, vs = 0, fs = 0; + bool ok = false; if(!vertexShader.empty()) vs = loadShader(vertexShader, GL_VERTEX_SHADER_ARB); @@ -36,25 +38,41 @@ bool Shader::loadProgram(const std::string &vertexShader, const std::string &fra program = glCreateProgramObjectARB(); - if(vs) - glAttachObjectARB(program, vs); + if(program) { + if(vs) + glAttachObjectARB(program, vs); + + if(fs) + glAttachObjectARB(program, fs); - if(fs) - glAttachObjectARB(program, fs); + glLinkProgramARB(program); + if(glGetError()) { + printInfoLog(program); + } + else { + ok = true; + } - glLinkProgramARB(program); - printInfoLog(program); + if(vs) { + glDeleteObjectARB(vs); + } - glUseProgramObjectARB(program); + if(fs) { + glDeleteObjectARB(fs); + } + } - return true; + if(ok) + return boost::shared_ptr(new Shader(program)); + else + return boost::shared_ptr(); } GLhandleARB Shader::loadShader(const std::string &name, GLenum type) { std::vector lines; std::ifstream file(("shader/" + name).c_str(), std::ios_base::in); if(!file.good()) - throw std::ios::failure("Can't read file '" + name + "'"); + return 0; while(file.good() && !file.eof()) { std::string line; @@ -69,12 +87,26 @@ GLhandleARB Shader::loadShader(const std::string &name, GLenum type) { strings[i] = lines[i].c_str(); } + bool ok = false; GLhandleARB shader = glCreateShaderObjectARB(type); - glShaderSourceARB(shader, lines.size(), strings.get(), 0); - glCompileShaderARB(shader); - printInfoLog(shader); - return shader; + if(shader) { + glShaderSourceARB(shader, lines.size(), strings.get(), 0); + glCompileShaderARB(shader); + if(glGetError()) { + printInfoLog(shader); + + glDeleteObjectARB(shader); + } + else { + ok = true; + } + } + + if(ok) + return shader; + else + return 0; } void Shader::printInfoLog(GLhandleARB obj) { -- cgit v1.2.3