diff --git a/libraries/pbrlib/genglsl/lib/mx_pre_convolve_environment.glsl b/libraries/pbrlib/genglsl/lib/mx_pre_convolve_environment.glsl index f7d1112afb..7c6d3f01b3 100644 --- a/libraries/pbrlib/genglsl/lib/mx_pre_convolve_environment.glsl +++ b/libraries/pbrlib/genglsl/lib/mx_pre_convolve_environment.glsl @@ -2,8 +2,33 @@ vec3 mx_pre_convolve_environment() { - vec2 uv = gl_FragCoord.xy / vec2(2048.0, 1024.0); + vec2 uv = gl_FragCoord.xy * pow(2.0, (float)$convolutionMipLevel) / vec2(2048.0, 1024.0); // vec2 ggxDirAlbedo = mx_ggx_dir_albedo(uv.x, uv.y, vec3(1, 0, 0), vec3(0, 1, 0)).xy; - return textureLod($envRadiance, uv, 0).rgb * vec3(uv, 0.0); + vec3 col = vec3(0, 0, 0); + switch ($convolutionMipLevel) + { + case 0: + col = vec3(1.0, 0.0, 0.0); + break; + case 1: + col = vec3(0.0, 1.0, 0.0); + break; + case 2: + col = vec3(0.0, 0.0, 1.0); + break; + case 3: + col = vec3(1.0, 0.0, 1.0); + break; + case 4: + col = vec3(1.0, 1.0, 0.0); + break; + case 5: + col = vec3(0.0, 1.0, 1.0); + break; + case 6: + col = vec3(1.0, 1.0, 1.0); + break; + } + return textureLod($envRadiance, uv, 0).rgb * col; // return vec3(uv, 0.0); } diff --git a/source/MaterialXGenShader/HwShaderGenerator.cpp b/source/MaterialXGenShader/HwShaderGenerator.cpp index 42dae6219b..426093e801 100644 --- a/source/MaterialXGenShader/HwShaderGenerator.cpp +++ b/source/MaterialXGenShader/HwShaderGenerator.cpp @@ -68,6 +68,7 @@ const string T_SHADOW_MAP = "$shadowMap"; const string T_SHADOW_MATRIX = "$shadowMatrix"; const string T_VERTEX_DATA_INSTANCE = "$vd"; const string T_LIGHT_DATA_INSTANCE = "$lightData"; +const string T_CONVOLUTION_MIP_LEVEL = "$convolutionMipLevel"; const string IN_POSITION = "i_position"; const string IN_NORMAL = "i_normal"; @@ -123,6 +124,7 @@ const string SHADOW_MATRIX = "u_shadowMatrix"; const string VERTEX_DATA_INSTANCE = "vd"; const string LIGHT_DATA_INSTANCE = "u_lightData"; const string LIGHT_DATA_MAX_LIGHT_SOURCES = "MAX_LIGHT_SOURCES"; +const string CONVOLUTION_MIP_LEVEL = "u_convolutionMipLevel"; const string VERTEX_INPUTS = "VertexInputs"; const string VERTEX_DATA = "VertexData"; @@ -222,6 +224,7 @@ HwShaderGenerator::HwShaderGenerator(SyntaxPtr syntax) : _tokenSubstitutions[HW::T_AMB_OCC_GAIN] = HW::AMB_OCC_GAIN; _tokenSubstitutions[HW::T_VERTEX_DATA_INSTANCE] = HW::VERTEX_DATA_INSTANCE; _tokenSubstitutions[HW::T_LIGHT_DATA_INSTANCE] = HW::LIGHT_DATA_INSTANCE; + _tokenSubstitutions[HW::T_CONVOLUTION_MIP_LEVEL] = HW::CONVOLUTION_MIP_LEVEL; // Setup closure contexts for defining closure functions // @@ -363,6 +366,7 @@ ShaderPtr HwShaderGenerator::createShader(const string& name, ElementPtr element if (context.getOptions().hwWriteEnvPreConvolution) { psPrivateUniforms->add(Type::FILENAME, HW::T_ENV_RADIANCE); + psPrivateUniforms->add(Type::INTEGER, HW::T_CONVOLUTION_MIP_LEVEL, Value::createValue<int>(1)); } // Create uniforms for the published graph interface diff --git a/source/MaterialXGenShader/HwShaderGenerator.h b/source/MaterialXGenShader/HwShaderGenerator.h index 66d60dc68a..5ac05ad542 100644 --- a/source/MaterialXGenShader/HwShaderGenerator.h +++ b/source/MaterialXGenShader/HwShaderGenerator.h @@ -135,6 +135,7 @@ extern MX_GENSHADER_API const string T_SHADOW_MAP; extern MX_GENSHADER_API const string T_SHADOW_MATRIX; extern MX_GENSHADER_API const string T_VERTEX_DATA_INSTANCE; extern MX_GENSHADER_API const string T_LIGHT_DATA_INSTANCE; +extern MX_GENSHADER_API const string T_CONVOLUTION_MIP_LEVEL; /// Default names for identifiers. /// Replacing above tokens in final code. @@ -192,6 +193,7 @@ extern MX_GENSHADER_API const string SHADOW_MATRIX; extern MX_GENSHADER_API const string VERTEX_DATA_INSTANCE; extern MX_GENSHADER_API const string LIGHT_DATA_INSTANCE; extern MX_GENSHADER_API const string LIGHT_DATA_MAX_LIGHT_SOURCES; +extern MX_GENSHADER_API const string CONVOLUTION_MIP_LEVEL; /// Variable blocks names. extern MX_GENSHADER_API const string VERTEX_INPUTS; // Geometric inputs for vertex stage. diff --git a/source/MaterialXView/RenderPipelineMetal.mm b/source/MaterialXView/RenderPipelineMetal.mm index 4c9e1e073e..fb2612a01c 100644 --- a/source/MaterialXView/RenderPipelineMetal.mm +++ b/source/MaterialXView/RenderPipelineMetal.mm @@ -218,6 +218,7 @@ framebuffer->bind(desc); material->bindShader(); + material->getProgram()->bindUniform(mx::HW::CONVOLUTION_MIP_LEVEL, mx::Value::createValue(i)); material->getProgram()->prepareUsedResources( MTL(renderCmdEncoder),