void LightsourceSimplePass::setup(GraphicContext &gc) { Size viewport_size = viewport->get_size(); if (fb.is_null() || !gc.is_frame_buffer_owner(fb) || final_color.updated() || zbuffer.updated() || diffuse_color_gbuffer.updated()) { final_color.set(Texture2D(gc, viewport->get_width(), viewport->get_height(), tf_rgba16f)); fb = FrameBuffer(gc); fb.attach_color(0, final_color.get()); fb.attach_depth(zbuffer.get()); BlendStateDescription blend_desc; blend_desc.enable_blending(true); blend_desc.set_blend_function(blend_one, blend_one, blend_one, blend_one); blend_state = BlendState(gc, 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 = DepthStencilState(gc, icosahedron_depth_stencil_desc); RasterizerStateDescription icosahedron_rasterizer_desc; icosahedron_rasterizer_desc.set_culled(true); icosahedron_rasterizer_state = RasterizerState(gc, 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 = DepthStencilState(gc, rect_depth_stencil_desc); RasterizerStateDescription rect_rasterizer_desc; rect_rasterizer_desc.set_culled(false); rect_rasterizer_state = RasterizerState(gc, rect_rasterizer_desc); uniforms = UniformVector<Uniforms>(gc, 1); icosahedron_prim_array = PrimitivesArray(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(gc); rect_prim_array.set_attributes(0, rect_positions); } }
Font::Font(std::string _fontName) : m_texture("texture/"+_fontName+".png"), m_effect( "shader/font.vs", "shader/font.ps", "shader/font.gs") { m_effect.SetRasterizerState(RasterizerState(RasterizerState::CULL_MODE::NONE, RasterizerState::FILL_MODE::SOLID)); m_effect.SetBlendState(BlendState(BlendState::BLEND_OPERATION::ADD, BlendState::BLEND::SRC_ALPHA, BlendState::BLEND::INV_SRC_ALPHA)); m_effect.SetDepthStencilState(DepthStencilState(DepthStencilState::COMPARISON_FUNC::ALWAYS, false)); m_effect.BindTexture( "u_characterTex", 7, Graphic::Resources::GetSamplerState(SamplerStates::LINEAR) ); m_effect.BindUniformBuffer( Graphic::Resources::GetUBO(UniformBuffers::GLOBAL) ); Jo::Files::HDDFile file("texture/"+_fontName+".sraw"); Jo::Files::MetaFileWrapper Wrap( file, Jo::Files::Format::SRAW ); auto& PosX = Wrap.RootNode[std::string("positionX")]; auto& PosY = Wrap.RootNode[std::string("positionY")]; auto& sizeX = Wrap.RootNode[std::string("sizeX")]; auto& sizeY = Wrap.RootNode[std::string("sizeY")]; //get values for(int i = 0; i < 256; i++) { m_sizeTable[i] = Vec2(sizeX[i],sizeY[i]); // Half pixel offset necessary - otherwise rounding errors in shader m_coordTable[i] = Vec2(float(PosX[i]) + 0.5f/m_texture.Width(),PosY[i]); // m_sizeTable[i] = Vec2(1-0.01f*i,i*0.01f);//0.1; 0.25 // m_coordTable[i] = Vec2(0.f,0.25f); } }
/** * Begin a rendering pass * * @param inPassName The rendering pass */ void RenderManager::BeginRendering(RenderPass inPass) { // Create any additional render states here static DepthStencilState noZNoStencil= DepthStencilState(false, false, CMP_Always, false, STENCILOP_Keep, STENCILOP_Keep, STENCILOP_Keep, CMP_Always, 0); static BlendState alphaBlend = BlendState(true, BLENDOP_Add, WEIGHT_SrcAlpha, WEIGHT_InvSrcAlpha, BLENDOP_Add, WEIGHT_SrcAlpha, WEIGHT_InvSrcAlpha,false, true, true, true, true); static BlendState additiveColorBlend = BlendState(true, BLENDOP_Add, WEIGHT_One, WEIGHT_One, BLENDOP_Add, WEIGHT_One, WEIGHT_Zero,false, true, true, true, true); switch(inPass) { case RENDERPASS_Geometry: gRenderAPI->BeginPerfEvent("Geometry Pass"); gRenderAPI->SetViewport(0,0,fullScreenBufferSizeX,fullScreenBufferSizeY); gRenderAPI->SetRenderBuffers(gBuffer, defaultSceneDepthBuffer); gRenderAPI->SetDepthStencilState(DepthStencilState::Default); gRenderAPI->SetBlendState(BlendState::Default); gRenderAPI->SetRasterizerState(RasterizerState::Default); gRenderAPI->Clear(true, ColorVector(0.0,0.0,0.0), true, 1.f); break; case RENDERPASS_Lighting: gRenderAPI->BeginPerfEvent("Lighting Pass"); gRenderAPI->SetViewport(0,0,fullScreenBufferSizeX,fullScreenBufferSizeY); gRenderAPI->SetRenderBuffers(defaultSceneColorBuffer, NULL); gRenderAPI->SetDepthStencilState(noZNoStencil); gRenderAPI->SetBlendState(additiveColorBlend); gRenderAPI->SetRasterizerState(RasterizerState::Default); gRenderAPI->Clear(true, ColorVector(0.0,0.0,0.0), false); break; case RENDERPASS_SceneColor: gRenderAPI->BeginPerfEvent("Scene Pass"); gRenderAPI->SetViewport(0,0,fullScreenBufferSizeX,fullScreenBufferSizeY); gRenderAPI->SetRenderBuffers(defaultSceneColorBuffer, defaultSceneDepthBuffer); gRenderAPI->SetDepthStencilState(DepthStencilState::Default); gRenderAPI->SetBlendState(BlendState::Default); gRenderAPI->SetRasterizerState(RasterizerState::Default); break; case RENDERPASS_GeometryWireframe: gRenderAPI->BeginPerfEvent("Wireframe Pass"); gRenderAPI->SetViewport(0,0,fullScreenBufferSizeX,fullScreenBufferSizeY); gRenderAPI->SetRenderBuffers(gBuffer, defaultSceneDepthBuffer); gRenderAPI->SetDepthStencilState(noZNoStencil); gRenderAPI->SetBlendState(BlendState::Default); gRenderAPI->SetRasterizerState(RasterizerState::Wireframe); gRenderAPI->Clear(true, ColorVector(0.0,0.0,0.0), false); break; case RENDERPASS_UI: gRenderAPI->BeginPerfEvent("UI Pass"); gRenderAPI->SetViewport(0,0,fullScreenBufferSizeX,fullScreenBufferSizeY); gRenderAPI->SetRenderBuffers(defaultSceneColorBuffer, defaultSceneDepthBuffer); gRenderAPI->SetDepthStencilState(noZNoStencil); gRenderAPI->SetBlendState(alphaBlend); gRenderAPI->SetRasterizerState(RasterizerState::Default); break; } gRenderAPI->BeginDraw(); }
ShaderEffect::ShaderEffect(GraphicContext &gc, const ShaderEffectDescription &description) : impl(std::make_shared<ShaderEffect_Impl>(gc)) { impl->create_shaders(gc, description.impl.get()); impl->create_primitives_array(gc, description.impl.get()); impl->create_frame_buffer(gc, description.impl.get()); impl->elements = description.impl->elements; impl->elements_type = description.impl->elements_type; impl->rasterizer_state = RasterizerState(gc, description.impl->rasterizer_state); impl->blend_state = BlendState(gc, description.impl->blend_state); impl->depth_stencil_state = DepthStencilState(gc, description.impl->depth_stencil_state); }
GraphicContext::GraphicContext(GraphicContextProvider *provider) : impl(new GraphicContext_Impl(provider)) { impl->default_rasterizer_state = RasterizerState(*this, RasterizerStateDescription()); impl->default_blend_state = BlendState(*this, BlendStateDescription()); impl->default_depth_stencil_state = DepthStencilState(*this, DepthStencilStateDescription()); reset_rasterizer_state(); reset_blend_state(); reset_depth_stencil_state(); }
void ParticleEmitterPass::setup(GraphicContext &gc) { if (program.is_null()) { std::string vertex_filename = PathHelp::combine(shader_path, "ParticleEmitter/vertex.hlsl"); std::string fragment_filename = PathHelp::combine(shader_path, "ParticleEmitter/fragment.hlsl"); program = ProgramObject::load(gc, vertex_filename, fragment_filename); program.bind_attribute_location(0, "AttrPosition"); program.bind_frag_data_location(0, "FragColor"); if (!program.link()) throw Exception(string_format("Particle emitter program failed to link: %1", program.get_info_log())); program.set_uniform_buffer_index("Uniforms", 0); program.set_uniform1i("NormalZTexture", 0); program.set_uniform1i("InstanceTexture", 1); program.set_uniform1i("ParticleTexture", 2); program.set_uniform1i("ParticleSampler", 2); program.set_uniform1i("ColorGradientTexture", 3); program.set_uniform1i("ColorGradientSampler", 3); billboard_positions = VertexArrayVector<Vec3f>(gc, cpu_billboard_positions, 6); } Size viewport_size = viewport->get_size(); if (fb.is_null() || !gc.is_frame_buffer_owner(fb) || final_color.updated() || zbuffer.updated()) { fb = FrameBuffer(gc); fb.attach_color(0, final_color.get()); fb.attach_depth(zbuffer.get()); BlendStateDescription blend_desc; blend_desc.enable_blending(true); blend_desc.set_blend_function(blend_src_alpha, blend_one_minus_src_alpha, blend_zero, blend_zero); blend_state = BlendState(gc, blend_desc); DepthStencilStateDescription depth_stencil_desc; depth_stencil_desc.enable_depth_write(false); depth_stencil_desc.enable_depth_test(true); depth_stencil_desc.set_depth_compare_function(compare_lequal); depth_stencil_state = DepthStencilState(gc, depth_stencil_desc); RasterizerStateDescription rasterizer_desc; rasterizer_desc.set_culled(false); rasterizer_state = RasterizerState(gc, rasterizer_desc); prim_array = PrimitivesArray(gc); prim_array.set_attributes(0, billboard_positions); } }