Understanding Allegorithmic Substance Designer custom shader.1
How to you would customizing for Allegorithmic Designer additional shaders.
Resource path at below...
C:\Program Files\Allegorithmic\Substance\Designer\4.x\resources\view3d\shaders
and we have to understand data structure.
This shader package struckture has XML format container with each type glsl shader code for example like physically_based.glslfx is xml data defined data and then fs.glsl with vs.glsl from physically_based sub folder.
concatenation link.
http://leegoonz.blogspot.kr/2014/04/wip-tutorialsunderstanding.html
below code is physically_based.glslfx that is like xml data format style.
It is just defined scripting code.
this sample code is C:\Program Files\Allegorithmic\Substance\Designer\4.x\resources\view3d\shaders\physically_based
Vertex Shader.
/////////////////////////////// Vertex shader #version 120 attribute vec4 iVS_Position; attribute vec4 iVS_Normal; attribute vec2 iVS_UV; attribute vec4 iVS_Tangent; attribute vec4 iVS_Binormal; varying vec3 iFS_Normal; varying vec2 iFS_UV; varying vec3 iFS_Tangent; varying vec3 iFS_Binormal; varying vec3 iFS_PointWS; uniform mat4 worldMatrix; uniform mat4 worldViewProjMatrix; uniform mat4 worldInverseTransposeMatrix; void main() { gl_Position = worldViewProjMatrix * iVS_Position; iFS_Normal = (worldInverseTransposeMatrix * iVS_Normal).xyz; iFS_UV = iVS_UV; iFS_Tangent = (worldInverseTransposeMatrix * iVS_Tangent).xyz; iFS_Binormal = (worldInverseTransposeMatrix * iVS_Binormal).xyz; iFS_PointWS = (worldMatrix * iVS_Position).xyz; }
and then glsl code at below.
Fragment shader
//////////////////////////////// Fragment shader #version 120 #extension GL_ARB_shader_texture_lod : require #define M_PI 3.1415926535897932384626433832795 #define M_INV_PI 0.31830988618379067153776752674503 #define M_INV_LOG2 1.4426950408889634073599246810019 varying vec3 iFS_Normal; varying vec2 iFS_UV; varying vec3 iFS_Tangent; varying vec3 iFS_Binormal; varying vec3 iFS_PointWS; uniform vec3 Lamp0Pos = vec3(0.0,0.0,70.0); uniform vec3 Lamp0Color = vec3(1.0,1.0,1.0); uniform float Lamp0Intensity = 1.0; uniform vec3 Lamp1Pos = vec3(70.0,0.0,0.0); uniform vec3 Lamp1Color = vec3(0.198,0.198,0.198); uniform float Lamp1Intensity = 1.0; //uniform vec3 AmbiColor; uniform float AmbiIntensity = 1.0; uniform float envRotation = 0.0; uniform float Depth = 0.0; uniform bool flipY = true; uniform sampler2D heightMap; uniform sampler2D normalMap; uniform sampler2D baseColorMap; uniform sampler2D metallicMap; uniform sampler2D roughnessMap; uniform sampler2D aoMap; uniform sampler2D environmentMap; uniform mat4 viewInverseMatrix; // Number of miplevels in the envmap uniform float maxLod = 12.0; // Maximum number of samples in the table const int maxNbSamples = 256; // Actual number of samples in the table uniform int nbSamples = 16; // Sample table uniform vec2 hammersley[maxNbSamples]; float normal_distrib( float ndh, float Roughness) { // use GGX / Trowbridge-Reitz, same as Disney and Unreal 4 // cf http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf p3 float alpha = Roughness * Roughness; float tmp = alpha / (ndh*ndh*(alpha*alpha-1.0)+1.0); return tmp * tmp * M_INV_PI; } vec3 fresnel( float vdh, vec3 F0) { // Schlick with Spherical Gaussian approximation // cf http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf p3 float sphg = pow(2.0, (-5.55473*vdh - 6.98316) * vdh); return F0 + (vec3(1.0, 1.0, 1.0) - F0) * sphg; } float G1( float ndw, // w is either Ln or Vn float k) { // One generic factor of the geometry function divided by ndw // NB : We should have k > 0 return 1.0 / ( ndw*(1.0-k) + k ); } float visibility( float ndl, float ndv, float Roughness) { // Schlick with Smith-like choice of k // cf http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf p3 // visibility is a Cook-Torrance geometry function divided by (n.l)*(n.v) float k = Roughness * Roughness * 0.5; return G1(ndl,k)*G1(ndv,k); } vec3 cook_torrance_brdf( vec3 Nn, vec3 Ln, vec3 Vn, vec3 Ks, float Roughness) { vec3 Hn = normalize(Vn + Ln); float vdh = max( 0.0, dot(Vn, Hn) ); float ndh = max( 0.0, dot(Nn, Hn) ); float ndl = max( 0.0, dot(Nn, Ln) ); float ndv = max( 0.0, dot(Nn, Vn) ); return fresnel(vdh,Ks) * ( normal_distrib(ndh,Roughness) * visibility(ndl,ndv,Roughness) / 4.0 ); } vec3 cook_torrance_contrib( float vdh, float ndh, float ndl, float ndv, vec3 Ks, float Roughness) { // This is the contribution when using importance sampling with the GGX based // sample distribution. This means ct_contrib = ct_brdf / ggx_probability return fresnel(vdh,Ks) * (visibility(ndl,ndv,Roughness) * vdh * ndl / ndh ); } vec3 diffuse_brdf( vec3 Nn, vec3 Ln, vec3 Vn, vec3 Kd) { return Kd; } vec3 fixNormalSample(vec3 v) { vec3 res = (v - vec3(0.5,0.5,0.5))*2.0; res.y = flipY ? -res.y : res.y; return res; } float ray_intersect_rm( // use linear and binary search in sampler2D bumpmap, in vec2 dp, in vec2 ds) { const int linear_search_steps=200; const int binary_search_steps=50; // current size of search window float size = 1.0/float(linear_search_steps); // current depth position float depth = 0.0; // search front to back for first point inside object for( int i=0;i0.0000001) ? dir.x / n : 0.0, dir.y); pos = acos(pos)*M_INV_PI; pos.x = (dir.z < 0.0) ? pos.x*0.5 : 1.0-(pos.x*0.5); pos.y = 1.0-pos.y; return texture2DLod(map, pos, lod).rgb; } void main() { vec3 cameraPosWS = viewInverseMatrix[3].xyz; vec3 pointToLight0DirWS = normalize(Lamp0Pos - iFS_PointWS); vec3 pointToLight1DirWS = normalize(Lamp1Pos - iFS_PointWS); vec3 pointToCameraDirWS = normalize(cameraPosWS - iFS_PointWS); // ------------------------------------------ // Update UV vec2 uv = iFS_UV; if (Depth > 0.0) { float a = dot(iFS_Normal,-pointToCameraDirWS); vec3 s = vec3( dot(pointToCameraDirWS,iFS_Tangent), dot(pointToCameraDirWS,iFS_Binormal), a); s *= Depth/a*0.1; vec2 ds = s.xy; vec2 dp = uv; float d = ray_intersect_rm(heightMap,dp,ds); uv = dp+ds*d; } // ------------------------------------------ // Add Normal from normalMap vec3 fixedNormalOS = iFS_Normal; // HACK for empty normal textures vec3 normalTS = texture2D(normalMap,uv).xyz; if(length(normalTS)>0.0001) { normalTS = fixNormalSample(normalTS); fixedNormalOS = normalize( normalTS.x*iFS_Tangent + normalTS.y*iFS_Binormal + normalTS.z*iFS_Normal ); } vec3 fixedNormalWS = fixedNormalOS; // ------------------------------------------ // Compute material model (diffuse, specular & roughness) const vec3 dielectricColor = vec3(0.04, 0.04, 0.04); const float minRoughness=1e-4; vec3 baseColor = texture2D(baseColorMap,uv).rgb; float metallic = texture2D(metallicMap,uv).r; float roughness = max(minRoughness, texture2D(roughnessMap,uv).r); vec3 diffColor = baseColor * (1.0 - metallic); vec3 specColor = mix(dielectricColor, baseColor, metallic); // ------------------------------------------ // Compute point lights contributions vec3 contrib0 = max(dot(fixedNormalWS,pointToLight0DirWS), 0.0) * ( ( diffuse_brdf( fixedNormalWS, pointToLight0DirWS, pointToCameraDirWS, diffColor) + cook_torrance_brdf( fixedNormalWS, pointToLight0DirWS, pointToCameraDirWS, specColor, roughness) ) *Lamp0Color*Lamp0Intensity ); vec3 contrib1 = max(dot(fixedNormalWS,pointToLight1DirWS), 0.0) * ( ( diffuse_brdf( fixedNormalWS, pointToLight1DirWS, pointToCameraDirWS, diffColor) + cook_torrance_brdf( fixedNormalWS, pointToLight1DirWS, pointToCameraDirWS, specColor, roughness) ) *Lamp1Color*Lamp1Intensity ); // ------------------------------------------ // Compute environment map contribution vec3 Tp = normalize(iFS_Tangent - fixedNormalWS*dot(iFS_Tangent, fixedNormalWS)); // local tangent vec3 Bp = normalize(iFS_Binormal - fixedNormalWS*dot(iFS_Binormal,fixedNormalWS) - Tp*dot(iFS_Binormal, Tp)); // local bitangent float ndv = max( 0.0, dot( pointToCameraDirWS, fixedNormalWS ) ); vec3 contribE = vec3(0.0,0.0,0.0); for(int i=0; i 0.0) { float vdh = max( 0.0, dot(pointToCameraDirWS, Hn) ); float ndh = max( 0.0, dot(fixedNormalWS, Hn) ); float lodS = roughness < 0.01 ? 0.0 : computeLOD(Ln, probabilityGGX(ndh, vdh, roughness)); contribE += samplePanoramicLOD(environmentMap,rotate(Ln,envRotation),lodS) * cook_torrance_contrib( vdh, ndh, ndl, ndv, specColor, roughness); } } contribE /= nbSamples; // Scale environment contribution contribE *= AmbiIntensity * texture2D(aoMap,uv).r; // ------------------------------------------ vec3 finalColor = contrib0 + contrib1 + contribE; // Final Color gl_FragColor = vec4(finalColor, 1.0); }
Game Developer Leegoon copyright all right reserved since 2010.
This comment has been removed by a blog administrator.
ReplyDeleteYour Post Is Really So Amazing And Great Thanks...Substance Designer
ReplyDeleteMblanutVcrud-pe Hector Buoy https://www.mtapothecary.com/profile/kristiannwatchman/profile
ReplyDeletepostcarczines