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);
	}
}
Example #2
0
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();
}
Example #4
0
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);
}
Example #5
0
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);
	}
}