ProgramObject LightsourceSimplePass::compile_and_link(GraphicContext &gc, const std::string &shader_path, const std::string &type) { ProgramObject program; std::string vertex_filename = PathHelp::combine(shader_path, string_format("LightsourceSimple/vertex_%1.%2", type, gc.get_shader_language() == shader_glsl ? "glsl" : "hlsl")); std::string fragment_filename = PathHelp::combine(shader_path, string_format("LightsourceSimple/fragment_light.%1", gc.get_shader_language() == shader_glsl ? "glsl" : "hlsl")); program = ShaderSetup::compile(gc, "", vertex_filename, fragment_filename, type == "rect" ? "RECT_PASS" : ""); program.bind_frag_data_location(0, "FragColor"); if (!program.link()) throw Exception("Shader linking failed!"); program.bind_attribute_location(0, "AttrPositionInObject"); program.set_uniform_buffer_index("Uniforms", 0); program.set_uniform1i("InstanceTexture", 0); program.set_uniform1i("NormalZTexture", 1); program.set_uniform1i("DiffuseColorTexture", 2); program.set_uniform1i("SpecularColorTexture", 3); program.set_uniform1i("SpecularLevelTexture", 4); program.set_uniform1i("ShadowMapsTexture", 5); program.set_uniform1i("ShadowMapsTextureSampler", 5); program.set_uniform1i("SelfIlluminationTexture", 6); return program; }
ProgramObject HSV::create_shader_program(GraphicContext &gc) { ProgramObject program = ProgramObject::load(gc, "Resources/vertex.glsl", "Resources/fragment.glsl"); program.bind_attribute_location(0, "Position"); program.bind_attribute_location(1, "TexCoord0"); program.set_uniform_buffer_index("ProgramUniforms", 0); if (!program.link()) throw Exception("Unable to link program"); return program; }
void ShaderEffect_Impl::create_shaders(GraphicContext &gc, const ShaderEffectDescription_Impl *description) { std::string vertex_shader_code = add_defines(gc, description->vertex_shader_code, description); std::string fragment_shader_code = add_defines(gc, description->fragment_shader_code, description); std::string compute_shader_code = add_defines(gc, description->compute_shader_code, description); if (!vertex_shader_code.empty()) { ShaderObject vertex_shader(gc, shadertype_vertex, vertex_shader_code); if(!vertex_shader.compile()) throw Exception(string_format("Unable to compile vertex shader: %1", vertex_shader.get_info_log())); program.attach(vertex_shader); } if (!fragment_shader_code.empty()) { ShaderObject fragment_shader(gc, shadertype_fragment, fragment_shader_code); if(!fragment_shader.compile()) throw Exception(string_format("Unable to compile fragment shader: %1", fragment_shader.get_info_log())); program.attach(fragment_shader); } if (!compute_shader_code.empty()) { ShaderObject compute_shader(gc, shadertype_compute, compute_shader_code); if(!compute_shader.compile()) throw Exception(string_format("Unable to compile compute shader: %1", compute_shader.get_info_log())); program.attach(compute_shader); } int index = 0; for(const auto & elem : description->attributes) { program.bind_attribute_location(index++, elem.first); } index = 0; for(const auto & elem : description->frag_data) { program.bind_frag_data_location(index++, elem.first); } if (!program.link()) throw Exception(string_format("Link failed: %1", program.get_info_log())); index = 0; for(auto it = description->uniform_buffers.begin(); it != description->uniform_buffers.end(); ++it, index++) { program.set_uniform_buffer_index(it->first, index); uniform_bindings[index] = it->second; } index = 0; for(auto it = description->textures.begin(); it != description->textures.end(); ++it, index++) { program.set_uniform1i(it->first, index); texture_bindings[index] = it->second; } index = 0; for(auto it = description->images.begin(); it != description->images.end(); ++it, index++) { program.set_uniform1i(it->first, index); image_bindings[index] = it->second; } index = 0; for(auto it = description->storage_buffers.begin(); it != description->storage_buffers.end(); ++it, index++) { program.set_uniform1i(it->first, index); storage_bindings[index] = it->second; } }