From a4fa46a4fda967348ea18961c177330491bdb953 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 15 Dec 2009 02:25:40 +0100 Subject: Added nice lighting shaders --- Shader.cpp | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 Shader.cpp (limited to 'Shader.cpp') diff --git a/Shader.cpp b/Shader.cpp new file mode 100644 index 0000000..420b6c6 --- /dev/null +++ b/Shader.cpp @@ -0,0 +1,95 @@ +/* + * Shader.cpp + * + * Copyright (C) 2009 Matthias Schiffer + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along + * with this program. If not, see . + */ + +#include "Shader.h" +#include +#include +#include +#include + +namespace Zoom { + +bool Shader::loadProgram(const std::string &vertexShader, const std::string &fragmentShader) { + GLhandleARB program, vs = 0, fs = 0; + + if(!vertexShader.empty()) + vs = loadShader(vertexShader, GL_VERTEX_SHADER_ARB); + + if(!fragmentShader.empty()) + fs = loadShader(fragmentShader, GL_FRAGMENT_SHADER_ARB); + + program = glCreateProgramObjectARB(); + + if(vs) + glAttachObjectARB(program, vs); + + if(fs) + glAttachObjectARB(program, fs); + + glLinkProgramARB(program); + printInfoLog(program); + + glUseProgramObjectARB(program); + + return true; +} + +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 + "'"); + + while(file.good() && !file.eof()) { + std::string line; + std::getline(file, line); + + if(!line.empty()) + lines.push_back(line); + } + + boost::scoped_array strings(new const char*[lines.size()]); + for(std::size_t i = 0; i < lines.size(); ++i) { + strings[i] = lines[i].c_str(); + } + + GLhandleARB shader = glCreateShaderObjectARB(type); + glShaderSourceARB(shader, lines.size(), strings.get(), 0); + glCompileShaderARB(shader); + printInfoLog(shader); + + return shader; +} + +void Shader::printInfoLog(GLhandleARB obj) { + int length = 0; + + glGetObjectParameterivARB(obj, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length); + + if(length > 0) { + boost::scoped_array log(new char[length]); + + int foo; + glGetInfoLogARB(obj, length, &foo, log.get()); + std::cerr << log.get() << std::endl; + } +} + + +} -- cgit v1.2.3