void LightsourceSimplePass::setup(const GraphicContextPtr &gc) { Size viewport_size = inout.viewport.size(); if (!blend_state) { BlendStateDescription blend_desc; blend_desc.enable_blending(true); blend_desc.set_blend_function(blend_one, blend_one, blend_one, blend_one); blend_state = gc->create_blend_state(blend_desc); DepthStencilStateDescription icosahedron_depth_stencil_desc; icosahedron_depth_stencil_desc.enable_depth_write(false); icosahedron_depth_stencil_desc.enable_depth_test(true); icosahedron_depth_stencil_desc.set_depth_compare_function(compare_lequal); icosahedron_depth_stencil_state = gc->create_depth_stencil_state(icosahedron_depth_stencil_desc); RasterizerStateDescription icosahedron_rasterizer_desc; icosahedron_rasterizer_desc.set_culled(true); icosahedron_rasterizer_state = gc->create_rasterizer_state(icosahedron_rasterizer_desc); DepthStencilStateDescription rect_depth_stencil_desc; rect_depth_stencil_desc.enable_depth_write(false); rect_depth_stencil_desc.enable_depth_test(false); rect_depth_stencil_state = gc->create_depth_stencil_state(rect_depth_stencil_desc); RasterizerStateDescription rect_rasterizer_desc; rect_rasterizer_desc.set_culled(false); rect_rasterizer_state = gc->create_rasterizer_state(rect_rasterizer_desc); uniforms = UniformVector<Uniforms>(gc, 1); icosahedron_prim_array = PrimitivesArray::create(gc); icosahedron_prim_array->set_attributes(0, icosahedron->vertices); 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_prim_array = PrimitivesArray::create(gc); rect_prim_array->set_attributes(0, rect_positions); } }
FinalPass::FinalPass(const GraphicContextPtr &gc, SceneRender &inout) : inout(inout) { if (gc->shader_language() == shader_glsl) { present_shader = ShaderSetup::compile(gc, "present", vertex_present_glsl(), fragment_present_glsl(), ""); present_shader->bind_frag_data_location(0, "FragColor"); } else { present_shader = ShaderSetup::compile(gc, "present", vertex_present_hlsl(), fragment_present_hlsl(), ""); } if (!present_shader->try_link()) throw Exception("Shader linking failed!"); present_shader->bind_attribute_location(0, "PositionInProjection"); present_shader->set_uniform1i("FinalColors", 0); present_shader->set_uniform1i("FinalColorsSampler", 0); present_shader->set_uniform1i("LogAverageLight", 1); present_shader->set_uniform1i("BloomColors", 2); present_shader->set_uniform1i("BloomColorsSampler", 2); present_shader->set_uniform1i("AmbientOcclusion", 3); present_shader->set_uniform1i("AmbientOcclusionSampler", 3); 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::create(gc); rect_primarray->set_attributes(0, rect_positions); RasterizerStateDescription rasterizer_desc; rasterizer_desc.set_culled(false); rasterizer_state = gc->create_rasterizer_state(rasterizer_desc); }