Skip to content

Commit

Permalink
Add new post-process functions (google#1400)
Browse files Browse the repository at this point in the history
  • Loading branch information
bejado authored Jul 11, 2019
1 parent 793198f commit 82c7e4d
Show file tree
Hide file tree
Showing 8 changed files with 131 additions and 0 deletions.
21 changes: 21 additions & 0 deletions libs/filamat/src/shaders/CodeGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,15 @@ io::sstream& CodeGenerator::generatePostProcessMainOld(io::sstream& out,
return out;
}

io::sstream& CodeGenerator::generatePostProcessMain(io::sstream& out, ShaderType type) const {
if (type == ShaderType::VERTEX) {
out << SHADERS_POST_PROCESS_VS_DATA;
} else if (type == ShaderType::FRAGMENT) {
out << SHADERS_POST_PROCESS_FS_DATA;
}
return out;
}

io::sstream& CodeGenerator::generateVariable(io::sstream& out, ShaderType type,
const CString& name, size_t index) const {

Expand Down Expand Up @@ -444,6 +453,18 @@ io::sstream& CodeGenerator::generateCommonMaterial(io::sstream& out, ShaderType
return out;
}

io::sstream& CodeGenerator::generateCommonPostProcess(io::sstream& out, ShaderType type) const {
if (type == ShaderType::FRAGMENT) {
out << SHADERS_COMMON_POST_PROCESS_FS_DATA;
}
return out;
}

utils::io::sstream& CodeGenerator::generateCommonGetters(utils::io::sstream& out) const {
out << SHADERS_COMMON_GETTERS_FS_DATA;
return out;
}

io::sstream& CodeGenerator::generateGetters(io::sstream& out, ShaderType type) const {
out << SHADERS_COMMON_GETTERS_FS_DATA;
if (type == ShaderType::VERTEX) {
Expand Down
3 changes: 3 additions & 0 deletions libs/filamat/src/shaders/CodeGenerator.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,13 @@ class UTILS_PRIVATE CodeGenerator {
// generate common functions for the given shader
utils::io::sstream& generateCommon(utils::io::sstream& out, ShaderType type) const;
utils::io::sstream& generateCommonMaterial(utils::io::sstream& out, ShaderType type) const;
utils::io::sstream& generateCommonPostProcess(utils::io::sstream& out, ShaderType type) const;

// generate the shader's main()
utils::io::sstream& generateShaderMain(utils::io::sstream& out, ShaderType type) const;
utils::io::sstream& generatePostProcessMainOld(utils::io::sstream& out, ShaderType type,
filament::PostProcessStage variant) const;
utils::io::sstream& generatePostProcessMain(utils::io::sstream& out, ShaderType type) const;

// generate the shader's code for the lit shading model
utils::io::sstream& generateShaderLit(utils::io::sstream& out, ShaderType type,
Expand Down Expand Up @@ -111,6 +113,7 @@ class UTILS_PRIVATE CodeGenerator {
utils::io::sstream& generateIndexedDefine(utils::io::sstream& out, const char* name,
uint32_t index, uint32_t value) const;

utils::io::sstream& generateCommonGetters(utils::io::sstream& out) const;
utils::io::sstream& generateGetters(utils::io::sstream& out, ShaderType type) const;
utils::io::sstream& generateParameters(utils::io::sstream& out, ShaderType type) const;

Expand Down
60 changes: 60 additions & 0 deletions libs/filamat/src/shaders/ShaderGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -452,5 +452,65 @@ void ShaderPostProcessGenerator::generatePostProcessStageDefines(utils::io::sstr
}
}

const std::string ShaderPostProcessGenerator::createPostProcessVertexProgram(
filament::backend::ShaderModel sm, MaterialBuilder::TargetApi targetApi,
MaterialBuilder::TargetLanguage targetLanguage, MaterialInfo const& material,
const filament::SamplerBindingMap& samplerBindingMap,
utils::CString const& postProcessCode) noexcept {
const CodeGenerator cg(sm, targetApi, targetLanguage);
utils::io::sstream vs;
cg.generateProlog(vs, ShaderType::VERTEX, false);
cg.generateDefine(vs, "LOCATION_POSITION", uint32_t(VertexAttribute::POSITION));

cg.generateUniforms(vs, ShaderType::VERTEX,
BindingPoints::PER_VIEW, UibGenerator::getPerViewUib());
cg.generateUniforms(vs, ShaderType::VERTEX,
BindingPoints::POST_PROCESS, UibGenerator::getPostProcessingUib());
cg.generateUniforms(vs, ShaderType::VERTEX,
BindingPoints::PER_MATERIAL_INSTANCE, material.uib);

cg.generateSamplers(vs,
material.samplerBindings.getBlockOffset(BindingPoints::PER_MATERIAL_INSTANCE),
material.sib);

cg.generateCommon(vs, ShaderType::VERTEX);
cg.generateCommonGetters(vs);
cg.generatePostProcessMain(vs, ShaderType::VERTEX);
cg.generateEpilog(vs);
return vs.c_str();
}

const std::string ShaderPostProcessGenerator::createPostProcessFragmentProgram(
filament::backend::ShaderModel sm, MaterialBuilder::TargetApi targetApi,
MaterialBuilder::TargetLanguage targetLanguage, MaterialInfo const& material,
const filament::SamplerBindingMap& samplerBindingMap,
utils::CString const& postProcessCode) noexcept {
const CodeGenerator cg(sm, targetApi, targetLanguage);
utils::io::sstream fs;
cg.generateProlog(fs, ShaderType::FRAGMENT, false);

cg.generateUniforms(fs, ShaderType::FRAGMENT,
BindingPoints::PER_VIEW, UibGenerator::getPerViewUib());
cg.generateUniforms(fs, ShaderType::FRAGMENT,
BindingPoints::POST_PROCESS, UibGenerator::getPostProcessingUib());
cg.generateUniforms(fs, ShaderType::FRAGMENT,
BindingPoints::PER_MATERIAL_INSTANCE, material.uib);

cg.generateSamplers(fs,
material.samplerBindings.getBlockOffset(BindingPoints::PER_MATERIAL_INSTANCE),
material.sib);

cg.generateCommon(fs, ShaderType::FRAGMENT);
cg.generateCommonGetters(fs);
cg.generateCommonPostProcess(fs, ShaderType::FRAGMENT);

// TODO: set the correct line offset.
appendShader(fs, postProcessCode, 0);

cg.generatePostProcessMain(fs, ShaderType::FRAGMENT);
cg.generateEpilog(fs);
return fs.c_str();
}


} // namespace filament
7 changes: 7 additions & 0 deletions libs/filamat/src/shaders/ShaderGenerator.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,13 @@ struct ShaderPostProcessGenerator {
filament::PostProcessStage variant, uint8_t firstSampler) noexcept;
static void generatePostProcessStageDefines(utils::io::sstream& vs, CodeGenerator const& cg,
filament::PostProcessStage variant) noexcept;

static const std::string createPostProcessVertexProgram(filament::backend::ShaderModel sm,
MaterialBuilder::TargetApi targetApi, MaterialBuilder::TargetLanguage targetLanguage, MaterialInfo const& material,
const filament::SamplerBindingMap& samplerBindingMap, utils::CString const& postProcessCode) noexcept;
static const std::string createPostProcessFragmentProgram(filament::backend::ShaderModel sm,
MaterialBuilder::TargetApi targetApi, MaterialBuilder::TargetLanguage targetLanguage, MaterialInfo const& material,
const filament::SamplerBindingMap& samplerBindingMap, utils::CString const& postProcessCode) noexcept;
};

} // namespace filament
Expand Down
3 changes: 3 additions & 0 deletions shaders/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ set(SHADERS
src/common_lighting.fs
src/common_material.fs
src/common_math.fs
src/common_post_process.fs
src/common_shading.fs
src/common_types.fs
src/conversion_functions.fs
Expand All @@ -36,6 +37,8 @@ set(SHADERS
src/main.vs
src/material_inputs.fs
src/material_inputs.vs
src/post_process.fs
src/post_process.vs
src/post_process_old.fs
src/post_process_old.vs
src/shading_lit.fs
Expand Down
12 changes: 12 additions & 0 deletions shaders/src/common_post_process.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
LAYOUT_LOCATION(0) in highp vec2 vertex_uv;

LAYOUT_LOCATION(0) out vec4 fragColor;

/** @public-api */
vec2 getUV() {
return vertex_uv;
}

struct PostProcessInputs {
vec4 color;
};
9 changes: 9 additions & 0 deletions shaders/src/post_process.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
void main() {
PostProcessInputs inputs;
inputs.color = vec4(1.0);

// Invoke user code
postProcess(inputs);

fragColor = inputs.color;
}
16 changes: 16 additions & 0 deletions shaders/src/post_process.vs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
LAYOUT_LOCATION(LOCATION_POSITION) in vec4 position;

LAYOUT_LOCATION(0) out vec2 vertex_uv;

void main() {
vertex_uv = (position.xy * 0.5 + 0.5) * frameUniforms.resolution.xy;

gl_Position = position;

#if defined(TARGET_METAL_ENVIRONMENT)
// Metal texture space is vertically flipped that of OpenGL's, so flip the Y coords so we sample
// the frame correctly. Vulkan doesn't need this fix because its clip space is mirrored
// (the Y axis points down the screen).
gl_Position.y = -gl_Position.y;
#endif
}

0 comments on commit 82c7e4d

Please sign in to comment.