//-------------------------------------------------------------- void ofShader::checkAndCreateProgram() { if(GL_ARB_shader_objects) { if(program == 0) { ofLog(OF_LOG_VERBOSE, "Creating GLSL Program"); program = glCreateProgram(); retainProgram(program); } } else { ofLog(OF_LOG_ERROR, "Sorry, it looks like you can't run 'ARB_shader_objects'.\nPlease check the capabilites of your graphics card.\nhttp://www.ozone3d.net/gpu_caps_viewer/"); } }
//-------------------------------------------------------------- ofShader::ofShader(const ofShader & mom) : program(mom.program), bLoaded(mom.bLoaded), shaders(mom.shaders){ if(mom.bLoaded){ retainProgram(program); for(unordered_map<GLenum, GLuint>::const_iterator it = shaders.begin(); it != shaders.end(); ++it){ GLuint shader = it->second; retainShader(shader); } } }
//-------------------------------------------------------------- void ofShader::checkAndCreateProgram() { #ifndef TARGET_OPENGLES if(GL_ARB_shader_objects) { #else if(ofIsGLProgrammableRenderer()){ #endif if(program == 0) { ofLogVerbose("ofShader") << "checkAndCreateProgram(): creating GLSL program"; program = glCreateProgram(); retainProgram(program); } } else { ofLogError("ofShader") << "sorry, it looks like you can't run 'ARB_shader_objects'"; ofLogError("ofShader") << "please check the capabilites of your graphics card: http://www.ozone3d.net/gpu_caps_viewer"; } } //-------------------------------------------------------------- bool ofShader::linkProgram() { if(shaders.empty()) { ofLogError("ofShader") << "linkProgram(): trying to link GLSL program, but no shaders created yet"; } else { checkAndCreateProgram(); for(unordered_map<GLenum, GLuint>::const_iterator it = shaders.begin(); it != shaders.end(); ++it){ GLuint shader = it->second; if(shader) { ofLogVerbose("ofShader") << "linkProgram(): attaching " << nameForType(it->first) << " shader to program " << program; glAttachShader(program, shader); } } glLinkProgram(program); checkProgramLinkStatus(program); // bLoaded means we have loaded shaders onto the graphics card; // it doesn't necessarily mean that these shaders have compiled and linked successfully. bLoaded = true; } return bLoaded; } void ofShader::bindAttribute(GLuint location, const string & name) const{ glBindAttribLocation(program,location,name.c_str()); }
//-------------------------------------------------------------- ofShader & ofShader::operator=(const ofShader & mom){ if(this == &mom) { return *this; } if(bLoaded){ unload(); } program = mom.program; bLoaded = mom.bLoaded; shaders = mom.shaders; if(mom.bLoaded){ retainProgram(program); for(unordered_map<GLenum, GLuint>::const_iterator it = shaders.begin(); it != shaders.end(); ++it){ GLuint shader = it->second; retainShader(shader); } } return *this; }