Exemplo n.º 1
0
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()];
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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);

}
Exemplo n.º 4
0
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;
}