User Guide Cancel

PBR Metal Rough - Shader API | Substance 3D Painter

PBR Metal Rough - Shader API

Allegorithmic Metal/Rough PBR shader

Import from libraries.

import lib-sss.glsl
import lib-pbr.glsl
import lib-emissive.glsl
import lib-pom.glsl
import lib-utils.glsl
import lib-sss.glsl import lib-pbr.glsl import lib-emissive.glsl import lib-pom.glsl import lib-utils.glsl
import lib-sss.glsl 
import lib-pbr.glsl 
import lib-emissive.glsl 
import lib-pom.glsl 
import lib-utils.glsl

Declare the iray mdl material to use with this shader.

//: metadata {
//: "mdl":"mdl::alg::materials::skin_metallic_roughness::skin_metallic_roughness"
//: }
//: metadata { //: "mdl":"mdl::alg::materials::skin_metallic_roughness::skin_metallic_roughness" //: }
//: metadata { 
//:   "mdl":"mdl::alg::materials::skin_metallic_roughness::skin_metallic_roughness" 
//: }

Channels needed for metal/rough workflow are bound here.

//: param auto channel_basecolor
uniform SamplerSparse basecolor_tex;
//: param auto channel_roughness
uniform SamplerSparse roughness_tex;
//: param auto channel_metallic
uniform SamplerSparse metallic_tex;
//: param auto channel_specularlevel
uniform SamplerSparse specularlevel_tex;
//: param auto channel_basecolor uniform SamplerSparse basecolor_tex; //: param auto channel_roughness uniform SamplerSparse roughness_tex; //: param auto channel_metallic uniform SamplerSparse metallic_tex; //: param auto channel_specularlevel uniform SamplerSparse specularlevel_tex;
//: param auto channel_basecolor 
uniform SamplerSparse basecolor_tex; 
//: param auto channel_roughness 
uniform SamplerSparse roughness_tex; 
//: param auto channel_metallic 
uniform SamplerSparse metallic_tex; 
//: param auto channel_specularlevel 
uniform SamplerSparse specularlevel_tex;

Shader entry point.

void shade(V2F inputs)
{
// Apply parallax occlusion mapping if possible
vec3 viewTS = worldSpaceToTangentSpace(getEyeVec(inputs.position), inputs);
applyParallaxOffset(inputs, viewTS);
// Fetch material parameters, and conversion to the specular/roughness model
float roughness = getRoughness(roughness_tex, inputs.sparse_coord);
vec3 baseColor = getBaseColor(basecolor_tex, inputs.sparse_coord);
float metallic = getMetallic(metallic_tex, inputs.sparse_coord);
float specularLevel = getSpecularLevel(specularlevel_tex, inputs.sparse_coord);
vec3 diffColor = generateDiffuseColor(baseColor, metallic);
vec3 specColor = generateSpecularColor(specularLevel, baseColor, metallic);
// Get detail (ambient occlusion) and global (shadow) occlusion factors
float occlusion = getAO(inputs.sparse_coord) * getShadowFactor();
float specOcclusion = specularOcclusionCorrection(occlusion, metallic, roughness);
LocalVectors vectors = computeLocalFrame(inputs);
// Feed parameters for a physically based BRDF integration
emissiveColorOutput(pbrComputeEmissive(emissive_tex, inputs.sparse_coord));
albedoOutput(diffColor);
diffuseShadingOutput(occlusion * envIrradiance(vectors.normal));
specularShadingOutput(specOcclusion * pbrComputeSpecular(vectors, specColor, roughness));
sssCoefficientsOutput(getSSSCoefficients(inputs.sparse_coord));
}
void shade(V2F inputs) { // Apply parallax occlusion mapping if possible vec3 viewTS = worldSpaceToTangentSpace(getEyeVec(inputs.position), inputs); applyParallaxOffset(inputs, viewTS); // Fetch material parameters, and conversion to the specular/roughness model float roughness = getRoughness(roughness_tex, inputs.sparse_coord); vec3 baseColor = getBaseColor(basecolor_tex, inputs.sparse_coord); float metallic = getMetallic(metallic_tex, inputs.sparse_coord); float specularLevel = getSpecularLevel(specularlevel_tex, inputs.sparse_coord); vec3 diffColor = generateDiffuseColor(baseColor, metallic); vec3 specColor = generateSpecularColor(specularLevel, baseColor, metallic); // Get detail (ambient occlusion) and global (shadow) occlusion factors float occlusion = getAO(inputs.sparse_coord) * getShadowFactor(); float specOcclusion = specularOcclusionCorrection(occlusion, metallic, roughness); LocalVectors vectors = computeLocalFrame(inputs); // Feed parameters for a physically based BRDF integration emissiveColorOutput(pbrComputeEmissive(emissive_tex, inputs.sparse_coord)); albedoOutput(diffColor); diffuseShadingOutput(occlusion * envIrradiance(vectors.normal)); specularShadingOutput(specOcclusion * pbrComputeSpecular(vectors, specColor, roughness)); sssCoefficientsOutput(getSSSCoefficients(inputs.sparse_coord)); }
void shade(V2F inputs) 
{ 
  // Apply parallax occlusion mapping if possible 
  vec3 viewTS = worldSpaceToTangentSpace(getEyeVec(inputs.position), inputs); 
  applyParallaxOffset(inputs, viewTS); 
 
  // Fetch material parameters, and conversion to the specular/roughness model 
  float roughness = getRoughness(roughness_tex, inputs.sparse_coord); 
  vec3 baseColor = getBaseColor(basecolor_tex, inputs.sparse_coord); 
  float metallic = getMetallic(metallic_tex, inputs.sparse_coord); 
  float specularLevel = getSpecularLevel(specularlevel_tex, inputs.sparse_coord); 
  vec3 diffColor = generateDiffuseColor(baseColor, metallic); 
  vec3 specColor = generateSpecularColor(specularLevel, baseColor, metallic); 
  // Get detail (ambient occlusion) and global (shadow) occlusion factors 
  float occlusion = getAO(inputs.sparse_coord) * getShadowFactor(); 
  float specOcclusion = specularOcclusionCorrection(occlusion, metallic, roughness); 
 
  LocalVectors vectors = computeLocalFrame(inputs); 
 
  // Feed parameters for a physically based BRDF integration 
  emissiveColorOutput(pbrComputeEmissive(emissive_tex, inputs.sparse_coord)); 
  albedoOutput(diffColor); 
  diffuseShadingOutput(occlusion * envIrradiance(vectors.normal)); 
  specularShadingOutput(specOcclusion * pbrComputeSpecular(vectors, specColor, roughness)); 
  sssCoefficientsOutput(getSSSCoefficients(inputs.sparse_coord)); 
} 
 

Get help faster and easier

New user?