Пример #1
0
void OpenGLPostProcessing::ApplyShader()
{
	// shader didn't changed
	if (m_initialized && m_config.GetShader() == g_ActiveConfig.sPostProcessingShader)
		return;

	m_shader.Destroy();
	m_uniform_bindings.clear();

	// load shader code
	std::string code = m_config.LoadShader();
	code = LoadShaderOptions(code);

	// and compile it
	if (!ProgramShaderCache::CompileShader(m_shader, s_vertex_shader, code))
	{
		ERROR_LOG(VIDEO, "Failed to compile post-processing shader %s", m_config.GetShader().c_str());
		g_ActiveConfig.sPostProcessingShader.clear();
		code = m_config.LoadShader();
		ProgramShaderCache::CompileShader(m_shader, s_vertex_shader, code);
	}

	// read uniform locations
	m_uniform_resolution = glGetUniformLocation(m_shader.glprogid, "resolution");
	m_uniform_time = glGetUniformLocation(m_shader.glprogid, "time");
	m_uniform_src_rect = glGetUniformLocation(m_shader.glprogid, "src_rect");
	m_uniform_layer = glGetUniformLocation(m_shader.glprogid, "layer");

	for (const auto& it : m_config.GetOptions())
	{
		std::string glsl_name = "option_" + it.first;
		m_uniform_bindings[it.first] = glGetUniformLocation(m_shader.glprogid, glsl_name.c_str());
	}
	m_initialized = true;
}
Пример #2
0
void OpenGLPostProcessing::ApplyShader()
{
	// shader didn't changed
	if (m_config.GetShader() == g_ActiveConfig.sPostProcessingShader)
		return;

	m_enable = false;
	m_shader.Destroy();
	m_uniform_bindings.clear();

	// shader disabled
	if (g_ActiveConfig.sPostProcessingShader == "")
		return;

	// so need to compile shader
	std::string code = m_config.LoadShader();

	if (code == "")
		return;

	code = LoadShaderOptions(code);

	// and compile it
	if (!ProgramShaderCache::CompileShader(m_shader, s_vertex_shader, code.c_str()))
	{
		ERROR_LOG(VIDEO, "Failed to compile post-processing shader %s", m_config.GetShader().c_str());
		return;
	}

	// read uniform locations
	m_uniform_resolution = glGetUniformLocation(m_shader.glprogid, "resolution");
	m_uniform_time = glGetUniformLocation(m_shader.glprogid, "time");

	for (const auto& it : m_config.GetOptions())
	{
		std::string glsl_name = "option_" + it.first;
		m_uniform_bindings[it.first] = glGetUniformLocation(m_shader.glprogid, glsl_name.c_str());
	}

	// successful
	m_enable = true;
}
Пример #3
0
void OpenGLPostProcessing::ApplyShader()
{
	// shader didn't changed
	if (m_initialized 
		&& m_config.GetShader() == g_ActiveConfig.sPostProcessingShader
		&& !m_config.NeedRecompile())
		return;
	if (m_config.NeedRecompile())
	{
		m_config.SaveOptionsConfiguration();
		m_config.SetRecompile(false);
	}
	DestroyStageOutput();
	m_stageOutput.resize(0);
	for (auto& shader : m_shaders)
	{
		shader.shader.Destroy();
	}
	// load shader code
	std::string code = m_config.LoadShader();
	code = LoadShaderOptions(code);

	const char* vertex_shader = s_vertex_shader;

	m_initialized = true;
	const auto& stages = m_config.GetStages();
	m_shaders.resize(stages.size());
	// and compile it
	const char* macros[1];
	for (size_t i = 0; i < stages.size(); i++)
	{
		// and compile it
		std::string entry_point = "#define ";
		entry_point += stages[i].m_stage_entry_point;
		entry_point += " main\n";
		macros[0] = entry_point.c_str();
		if (!ProgramShaderCache::CompileShader(m_shaders[i].shader, vertex_shader, code.c_str(), nullptr, macros, 1))
		{
			ERROR_LOG(VIDEO, "Failed to compile post-processing shader %s", m_config.GetShader().c_str());
			m_initialized = false;
			break;
		}
	}

	// and compile it
	if (!m_initialized)
	{
		g_Config.sPostProcessingShader.clear();
		g_ActiveConfig.sPostProcessingShader.clear();
		for (auto& shader : m_shaders)
		{
			shader.shader.Destroy();
		}
		m_shaders.resize(1);
		code = m_config.LoadShader();
		code = LoadShaderOptions(code);
		ProgramShaderCache::CompileShader(m_shaders[0].shader, vertex_shader, code.c_str());
	}

	for (auto& shader : m_shaders)
	{
		shader.m_uniform_resolution = glGetUniformLocation(shader.shader.glprogid, "resolution");
		shader.m_uniform_gamma = glGetUniformLocation(shader.shader.glprogid, "native_gamma");
		shader.m_uniform_time = glGetUniformLocation(shader.shader.glprogid, "time");
		shader.m_uniform_src_rect = glGetUniformLocation(shader.shader.glprogid, "src_rect");
		shader.m_uniform_layer = glGetUniformLocation(shader.shader.glprogid, "layer");
		shader.m_uniform_dstscale = glGetUniformLocation(shader.shader.glprogid, "dst_scale");
		shader.m_uniform_ScalingFilter = glGetUniformLocation(shader.shader.glprogid, "scaling_filter");
		shader.m_uniform_bindings.clear();
		for (const auto& it : m_config.GetOptions())
		{
			std::string glsl_name = "option_" + it.first;
			shader.m_uniform_bindings[it.first] = glGetUniformLocation(shader.shader.glprogid, glsl_name.c_str());
		}
	}
	
	m_initialized = true;
}
Пример #4
0
void OpenGLPostProcessing::ApplyShader()
{
	// shader didn't changed
	if (m_initialized && m_config.GetShader() == g_ActiveConfig.sPostProcessingShader &&
			((g_ActiveConfig.iStereoMode == STEREO_ANAGLYPH) == m_anaglyph))
		return;

	m_shader.Destroy();
	m_uniform_bindings.clear();

	// load shader code
	std::string code = "";
	std::string default_shader = "void main() { SetOutput(Sample()); }\n";

	if (g_ActiveConfig.iStereoMode == STEREO_ANAGLYPH)
		code = "void main() { SetOutput(float4(pow(0.7 * SampleLayer(0).g + 0.3 * SampleLayer(0).b, 1.5), SampleLayer(1).gba)); }\n";
	else if (g_ActiveConfig.sPostProcessingShader != "")
		code = m_config.LoadShader();

	if (code == "")
		code = default_shader;

	code = LoadShaderOptions(code);

	const char* vertex_shader = s_vertex_shader;

	if (m_attribute_workaround)
		vertex_shader = s_vertex_workaround_shader;

	// and compile it
	if (!ProgramShaderCache::CompileShader(m_shader, vertex_shader, code.c_str()))
	{
		ERROR_LOG(VIDEO, "Failed to compile post-processing shader %s", m_config.GetShader().c_str());

		code = LoadShaderOptions(default_shader);
		ProgramShaderCache::CompileShader(m_shader, vertex_shader, code.c_str());
	}

	// read uniform locations
	m_uniform_resolution = glGetUniformLocation(m_shader.glprogid, "resolution");
	m_uniform_time = glGetUniformLocation(m_shader.glprogid, "time");
	m_uniform_src_rect = glGetUniformLocation(m_shader.glprogid, "src_rect");
	m_uniform_layer = glGetUniformLocation(m_shader.glprogid, "layer");

	if (m_attribute_workaround)
	{
		GLfloat vertices[] = {
			-1.f, -1.f, 0.f, 0.f,
			 1.f, -1.f, 1.f, 0.f,
			-1.f,  1.f, 0.f, 1.f,
			 1.f,  1.f, 1.f, 1.f,
		};

		glBindBuffer(GL_ARRAY_BUFFER, m_attribute_vbo);
		glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

		glBindVertexArray(m_attribute_vao);
		glEnableVertexAttribArray(SHADER_POSITION_ATTRIB);
		glVertexAttribPointer(SHADER_POSITION_ATTRIB, 4, GL_FLOAT, 0, 0, nullptr);
	}

	for (const auto& it : m_config.GetOptions())
	{
		std::string glsl_name = "option_" + it.first;
		m_uniform_bindings[it.first] = glGetUniformLocation(m_shader.glprogid, glsl_name.c_str());
	}
	m_anaglyph = g_ActiveConfig.iStereoMode == STEREO_ANAGLYPH;
	m_initialized = true;
}