export const shader = { vertex: ` uniform vec3 color; varying vec3 pixelNormal; void main() { pixelNormal = normal; gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); }`, vertexClipping: ` uniform vec3 color; uniform vec3 clippingLow; uniform vec3 clippingHigh; varying vec3 pixelNormal; varying vec4 worldPosition; varying vec3 camPosition; varying vec3 vNormal; varying vec3 vPosition; varying vec2 vUv; void main() { vUv = uv; vec4 vPos = modelViewMatrix * vec4( position, 1.0 ); vPosition = vPos.xyz; vNormal = normalMatrix * normal; pixelNormal = normal; worldPosition = modelMatrix * vec4( position, 1.0 ); camPosition = cameraPosition; // gl_Position = projectionMatrix * vPos; gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); }`, fragment: ` uniform vec3 color; varying vec3 pixelNormal; varying vec3 vNormal; varying vec3 vPosition; // uniform vec3 spotLightPosition; // in world space // uniform vec3 clight; // uniform vec3 cspec; // uniform float roughness; const float PI = 3.14159; void main( void ) { float shade = ( 3.0 * pow ( abs ( pixelNormal.y ), 2.0 ) + 2.0 * pow ( abs ( pixelNormal.z ), 2.0 ) + 1.0 * pow ( abs ( pixelNormal.x ), 2.0 ) ) / 3.0; gl_FragColor = vec4( color * shade, 1.0 ); //gl_FragColor = vec4(color, 1.0); // vec4 lPosition = viewMatrix * vec4( spotLightPosition, 1.0 ); // vec3 l = normalize(lPosition.xyz - vPosition.xyz); // vec3 n = normalize( vNormal ); // interpolation destroys normalization, so we have to normalize // vec3 v = normalize( -vPosition); // vec3 h = normalize( v + l); // // small quantity to prevent divisions by 0 // float nDotl = max(dot( n, l ),0.000001); // float lDoth = max(dot( l, h ),0.000001); // float nDoth = max(dot( n, h ),0.000001); // float vDoth = max(dot( v, h ),0.000001); // float nDotv = max(dot( n, v ),0.000001); // vec3 specularBRDF = FSchlick(lDoth)*GSmith(nDotv,nDotl)*DGGX(nDoth,roughness*roughness)/(4.0*nDotl*nDotv); // vec3 outRadiance = (PI* clight * nDotl * specularBRDF); // gl_FragColor = vec4(pow( outRadiance, vec3(1.0/2.2)), 1.0); }`, fragmentClippingFront: ` uniform sampler2D map; uniform vec3 color; uniform vec3 clippingLow; uniform vec3 clippingHigh; uniform float clippingScale; uniform float percent; varying vec3 pixelNormal; varying vec4 worldPosition; varying vec3 camPosition; varying vec2 vUv; void main( void ) { float shade = ( 3.0 * pow ( abs ( pixelNormal.y ), 2.0 ) + 2.0 * pow ( abs ( pixelNormal.z ), 2.0 ) + 1.0 * pow ( abs ( pixelNormal.x ), 2.0 ) ) / 3.0; if ( worldPosition.x < clippingLow.x || worldPosition.x > clippingHigh.x || worldPosition.y < clippingLow.y || worldPosition.y > clippingHigh.y || worldPosition.z < (clippingLow.z * clippingScale) || worldPosition.z > (clippingHigh.z * clippingScale) ) { discard; } else { gl_FragColor = texture2D(map, vUv); gl_FragColor.a = percent; } }`, vertexMeshStandard: ` #define STANDARD varying vec3 vViewPosition; varying vec4 worldPosition; #include #include #include #include #include #include #include void main() { #include #include #include #include #include #include #include #include vViewPosition = -mvPosition.xyz; worldPosition = modelMatrix * vec4(position, 1.0); #include #include } `, fragmentClippingMeshStandard: ` #define STANDARD uniform vec3 diffuse; uniform vec3 emissive; uniform float roughness; uniform float metalness; uniform float opacity; varying vec3 vViewPosition; varying vec4 worldPosition; uniform vec3 clippingLow; uniform vec3 clippingHigh; uniform float clippingScale; #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void main() { #include vec4 diffuseColor = vec4(diffuse, opacity); ReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0)); vec3 totalEmissiveRadiance = emissive; #ifdef TRANSMISSION float totalTransmission = transmission; float thicknessFactor = thickness; #endif #include #include #include #include #include #include #include #include #include #include vec3 rawDiffuseColor = diffuseColor.rgb; #include // Lighting calculations #include #include // Ambient occlusion #include vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance; // Clipping logic if (any(greaterThan(worldPosition.xyz, clippingHigh)) || any(lessThan(worldPosition.xyz, clippingLow))) { discard; } gl_FragColor = vec4(outgoingLight, diffuseColor.a); } `, invisibleVertexShader: ` void main() { vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 ); gl_Position = projectionMatrix * mvPosition; }`, invisibleFragmentShader: ` void main( void ) { gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 ); discard; }`, };