std::string ShaderEffect_Impl::add_defines(GraphicContext &gc, const std::string * const code, const ShaderEffectDescription_Impl *description) { if (code[gc.get_shader_language()].empty()) return std::string(); std::string prefix; if (gc.get_shader_language() == shader_glsl && description->glsl_version != 0) prefix += string_format("#version %1\r\n", description->glsl_version); for (const auto & elem : description->defines) prefix += string_format("#define %1 %2\r\n", elem.first, elem.second); prefix += "#line 0\r\n"; return prefix + code[gc.get_shader_language()]; }
BloomPass::BloomPass(GraphicContext &gc, const std::string &shader_path, ResourceContainer &inout) { viewport = inout.get<Rect>("Viewport"); final_color = inout.get<Texture2D>("FinalColor"); bloom_contribution = inout.get<Texture2D>("BloomContribution"); if (gc.get_shader_language() == shader_glsl) { bloom_shader = ShaderSetup::compile(gc, "", PathHelp::combine(shader_path, "Final/vertex_present.glsl"), PathHelp::combine(shader_path, "Bloom/fragment_bloom_extract.glsl"), ""); bloom_shader.bind_frag_data_location(0, "FragColor"); } else { bloom_shader = ShaderSetup::compile(gc, "", PathHelp::combine(shader_path, "Final/vertex_present.hlsl"), PathHelp::combine(shader_path, "Bloom/fragment_bloom_extract.hlsl"), ""); } ShaderSetup::link(bloom_shader, "bloom extract program"); bloom_shader.bind_attribute_location(0, "PositionInProjection"); bloom_shader.set_uniform1i("FinalColors", 0); bloom_shader.set_uniform1i("FinalColorsSampler", 0); bloom_shader.set_uniform1i("LogAverageLight", 1); Vec4f positions[6] = { Vec4f(-1.0f, -1.0f, 1.0f, 1.0f), Vec4f( 1.0f, -1.0f, 1.0f, 1.0f), Vec4f(-1.0f, 1.0f, 1.0f, 1.0f), Vec4f( 1.0f, -1.0f, 1.0f, 1.0f), Vec4f(-1.0f, 1.0f, 1.0f, 1.0f), Vec4f( 1.0f, 1.0f, 1.0f, 1.0f) }; rect_positions = VertexArrayVector<Vec4f>(gc, positions, 6); rect_primarray = PrimitivesArray(gc); rect_primarray.set_attributes(0, rect_positions); bloom_blur.input = bloom_contribution; BlendStateDescription blend_desc; blend_desc.enable_blending(false); blend_state = BlendState(gc, blend_desc); }
Shader::Shader(GraphicContext &gc) { ShaderLanguage shader_language = gc.get_shader_language(); ShaderObject vertex_shader(gc, shadertype_vertex, shader_language==shader_glsl ? vertex_glsl : vertex_hlsl); if(!vertex_shader.compile()) { std::string log = vertex_shader.get_info_log(); throw Exception(string_format("Unable to compile vertex shader object: %1", log)); } ShaderObject fragment_shader(gc, shadertype_fragment, shader_language==shader_glsl ? fragment_glsl : fragment_hlsl); if(!fragment_shader.compile()) { std::string log = fragment_shader.get_info_log(); throw Exception(string_format("Unable to compile fragment shader object: %1", log)); } program_object = ProgramObject(gc); program_object.attach(vertex_shader); program_object.attach(fragment_shader); program_object.bind_attribute_location(0, "InPosition"); program_object.bind_attribute_location(1, "InNormal"); program_object.bind_attribute_location(2, "InMaterialAmbient"); program_object.bind_frag_data_location(0, "cl_FragColor"); if (!program_object.link()) { throw Exception(string_format("Unable to link program object: %1", program_object.get_info_log())); } program_object.set_uniform_buffer_index("ProgramUniforms", 0); gpu_uniforms = clan::UniformVector<ProgramUniforms>(gc, 1); uniforms.LightAmbient = Vec4f(0.2f, 0.2f, 0.2f, 1.0f); uniforms.LightVector = Vec3f(0.0f, 0.0f, -1.0f); uniforms.LightDiffuse = Vec4f(0.7f, 0.7f, 0.7f, 1.0f); }
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; }