From fce4d8a3d6608feb5a30e1233817f51e3f272359 Mon Sep 17 00:00:00 2001 From: Dusan Bosnjak Date: Fri, 10 Feb 2017 16:25:43 -0800 Subject: [PATCH 01/17] shader chunk overrides per material adds optional shader chunk overrides per material instance --- examples/webgl_materials_shader_override.html | 680 ++++++++++++++++++ src/renderers/webgl/WebGLProgram.js | 12 +- 2 files changed, 688 insertions(+), 4 deletions(-) create mode 100644 examples/webgl_materials_shader_override.html diff --git a/examples/webgl_materials_shader_override.html b/examples/webgl_materials_shader_override.html new file mode 100644 index 00000000000000..eb044d6fecb3f0 --- /dev/null +++ b/examples/webgl_materials_shader_override.html @@ -0,0 +1,680 @@ + + + + three.js webgl - shader include override example + + + + + + + +
+ +
+ three.js webgl - clip system + - knight by apendua +
+
+ + + + + + + + + + + diff --git a/src/renderers/webgl/WebGLProgram.js b/src/renderers/webgl/WebGLProgram.js index da2f633516e470..964c61e65536e6 100644 --- a/src/renderers/webgl/WebGLProgram.js +++ b/src/renderers/webgl/WebGLProgram.js @@ -150,13 +150,13 @@ function replaceLightNums( string, parameters ) { } -function parseIncludes( string ) { +function parseIncludes( string , materialIncludes ) { var pattern = /#include +<([\w\d.]+)>/g; function replace( match, include ) { - var replace = ShaderChunk[ include ]; + var replace = undefined !== materialIncludes[ include ] ? materialIncludes[ include ] : ShaderChunk[ include ]; if ( replace === undefined ) { @@ -201,6 +201,8 @@ function WebGLProgram( renderer, code, material, parameters ) { var extensions = material.extensions; var defines = material.defines; + var materialIncludes = material.shaderIncludes; + var vertexShader = material.__webglShader.vertexShader; var fragmentShader = material.__webglShader.fragmentShader; @@ -282,6 +284,8 @@ function WebGLProgram( renderer, code, material, parameters ) { var customDefines = generateDefines( defines ); + var customIncludes = undefined !== materialIncludes ? materialIncludes : {}; + // var program = gl.createProgram(); @@ -493,10 +497,10 @@ function WebGLProgram( renderer, code, material, parameters ) { } - vertexShader = parseIncludes( vertexShader, parameters ); + vertexShader = parseIncludes( vertexShader, customIncludes ); vertexShader = replaceLightNums( vertexShader, parameters ); - fragmentShader = parseIncludes( fragmentShader, parameters ); + fragmentShader = parseIncludes( fragmentShader, customIncludes ); fragmentShader = replaceLightNums( fragmentShader, parameters ); if ( ! material.isShaderMaterial ) { From d57ab1bade19460eb161b2f5e2028d1d05fe1053 Mon Sep 17 00:00:00 2001 From: Dusan Bosnjak Date: Fri, 10 Feb 2017 16:51:29 -0800 Subject: [PATCH 02/17] missing files.js for examples? --- examples/files.js | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/files.js b/examples/files.js index 7969f56cbb759c..180ee369fd5068 100644 --- a/examples/files.js +++ b/examples/files.js @@ -160,6 +160,7 @@ var files = { "webgl_materials_variations_toon", "webgl_materials_video", "webgl_materials_wireframe", + 'webgl_materials_shader_override', "webgl_mirror", "webgl_mirror_nodes", "webgl_modifier_simplifier", From d3998b7d9ccf5fe805d2b1da230c2d9bf7e57173 Mon Sep 17 00:00:00 2001 From: Dusan Bosnjak Date: Wed, 15 Feb 2017 00:24:36 -0800 Subject: [PATCH 03/17] proof of concept / cache fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit a simple vertex deformation injection, works with Object3D matrix, doesn’t do normals correctly, needs uniform hookup for animation --- examples/webgl_materials_shader_override.html | 719 ++++-------------- src/renderers/webgl/WebGLPrograms.js | 10 + 2 files changed, 169 insertions(+), 560 deletions(-) diff --git a/examples/webgl_materials_shader_override.html b/examples/webgl_materials_shader_override.html index eb044d6fecb3f0..715750beb33271 100644 --- a/examples/webgl_materials_shader_override.html +++ b/examples/webgl_materials_shader_override.html @@ -6,675 +6,274 @@ - - -
-
- three.js webgl - clip system - - knight by apendua -
+ three.js - Material shader override example by pailhead
- + + - - diff --git a/src/renderers/webgl/WebGLPrograms.js b/src/renderers/webgl/WebGLPrograms.js index f15d6d856cb98d..9984538b75b2a8 100644 --- a/src/renderers/webgl/WebGLPrograms.js +++ b/src/renderers/webgl/WebGLPrograms.js @@ -239,6 +239,16 @@ function WebGLPrograms( renderer, capabilities ) { } + if ( material.shaderIncludes !== undefined ){ + + for( var include in material.shaderIncludes ){ + + array.push( material.shaderIncludes[ include ] ); + + } + + } + return array.join(); }; From 9855a9aaaa2c2efe31eee0def39723a0a11ab491 Mon Sep 17 00:00:00 2001 From: Dusan Bosnjak Date: Sat, 18 Feb 2017 15:03:35 -0800 Subject: [PATCH 04/17] hooked uniforms + example --- examples/webgl_materials_shader_override.html | 66 ++++++++++++++----- src/renderers/WebGLRenderer.js | 21 +++++- 2 files changed, 68 insertions(+), 19 deletions(-) diff --git a/examples/webgl_materials_shader_override.html b/examples/webgl_materials_shader_override.html index 715750beb33271..01ea77024d7f55 100644 --- a/examples/webgl_materials_shader_override.html +++ b/examples/webgl_materials_shader_override.html @@ -33,6 +33,7 @@ + + + + + + + + + + diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index fed68a2765fd2f..74aef7211f7942 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -1548,9 +1548,13 @@ function WebGLRenderer( parameters ) { var shader = ShaderLib[ parameters.shaderID ]; + var ph_uniforms = undefined !== material.shaderUniforms ? + UniformsUtils.merge([ UniformsUtils.clone( shader.uniforms ) , material.shaderUniforms ]) : + UniformsUtils.clone( shader.uniforms ); + materialProperties.__webglShader = { name: material.type, - uniforms: UniformsUtils.clone( shader.uniforms ), + uniforms: ph_uniforms, vertexShader: shader.vertexShader, fragmentShader: shader.fragmentShader }; @@ -1883,6 +1887,13 @@ function WebGLRenderer( parameters ) { } + //refresh shaderUniforms + if ( undefined !== material.shaderUniforms ) { + + refreshUniformsCustom( m_uniforms , material ); + + } + // refresh single material specific uniforms if ( material.isLineBasicMaterial ) { @@ -2065,6 +2076,14 @@ function WebGLRenderer( parameters ) { } + function refreshUniformsCustom( uniforms, material ) { + + for ( var uniform in material.shaderUniforms ) + + uniforms[ uniform ].value = material.shaderUniforms[ uniform ].value; + + } + function refreshUniformsLine( uniforms, material ) { uniforms.diffuse.value = material.color; From 4f4fb27a9f38783e53485aa84ba7049e4fdca779 Mon Sep 17 00:00:00 2001 From: Dusan Bosnjak Date: Sat, 18 Feb 2017 15:53:40 -0800 Subject: [PATCH 05/17] changed example --- examples/webgl_materials_shader_override.html | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/examples/webgl_materials_shader_override.html b/examples/webgl_materials_shader_override.html index 01ea77024d7f55..3581ed7bd1b251 100644 --- a/examples/webgl_materials_shader_override.html +++ b/examples/webgl_materials_shader_override.html @@ -53,9 +53,17 @@ initScene(); initMisc(); + var shaderOption = { switch: true }; + gui = new dat.GUI(); gui.add( sphere.material.shaderUniforms.uVertexOffset , 'value' , 0 , 1 ); + gui.add( sphere.material.shaderUniforms.uNoiseScale , 'value' , 0 , 1 ); + gui.add( shaderOption , 'switch' ).onChange( function(){ + + sphere.material.shaderUniforms.uSwitch.value = shaderOption.switch ? 1 : 0; + + }); document.body.appendChild( renderer.domElement ); window.addEventListener( 'resize', onWindowResize, false ); @@ -127,6 +135,8 @@ "uniform float uVertexOffset;", + "uniform int uSwitch;", + //a noise function "float noise(vec3 p)", @@ -150,9 +160,21 @@ begin_vertex: [ - "float offset = sin( position.z * 5. );", + "float offset;", - "vec3 transformed = vec3( position ) + vec3(0.,offset,.0) * uVertexOffset;" + "if ( uSwitch == 0 ) {", + + " vec2 ll = vec2( atan( position.x , position.y ) , acos( position.z / length( position ) ) );", + + " offset = min( sin( ll.x * 16.5 * uNoiseScale ) , sin( ll.y * 16.5 * uNoiseScale ) ) * .5 + .5;", + + "}", + + "else ", + + " offset = noise( position * uNoiseScale );", + + "vec3 transformed = vec3( position ) + normal * offset * uVertexOffset;" ].join("\n") @@ -166,7 +188,9 @@ uNoiseScale:{ value : 1 }, - uVertexOffset:{ value : 1 } + uVertexOffset:{ value : 1 }, + + uSwitch:{ value : 1 } }; From 796a40efeb8438ba552355a78fcebd1211c4e18b Mon Sep 17 00:00:00 2001 From: Dusan Bosnjak Date: Sat, 18 Feb 2017 16:06:10 -0800 Subject: [PATCH 06/17] change example some more --- examples/webgl_materials_shader_override.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/webgl_materials_shader_override.html b/examples/webgl_materials_shader_override.html index 3581ed7bd1b251..1f9f163c53552d 100644 --- a/examples/webgl_materials_shader_override.html +++ b/examples/webgl_materials_shader_override.html @@ -108,7 +108,7 @@ scene.add( dirLight ); // Geometry - var geometry = new THREE.SphereBufferGeometry( 4, 128, 128 ); + var geometry = new THREE.SphereBufferGeometry( 4, 200, 200 ); /** @@ -166,7 +166,7 @@ " vec2 ll = vec2( atan( position.x , position.y ) , acos( position.z / length( position ) ) );", - " offset = min( sin( ll.x * 16.5 * uNoiseScale ) , sin( ll.y * 16.5 * uNoiseScale ) ) * .5 + .5;", + " offset = min( sin( ll.x * 16. * uNoiseScale ) , sin( ll.y * 16. * uNoiseScale ) ) * .5 + .5;", "}", @@ -226,7 +226,7 @@ color: 0xff0000, shininess: 150, specular: 0x222222, - shading: THREE.SmoothShading + shading: THREE.FlatShading } ); From e73c718cfe16d36b2fb0c4f57ae236b0c216865e Mon Sep 17 00:00:00 2001 From: Dusan Bosnjak Date: Thu, 23 Mar 2017 16:06:13 -0700 Subject: [PATCH 07/17] add IS_VERTEX and IS_FRAGMENT to shader defines https://github.com/mrdoob/three.js/pull/10750 Allows for adding stuff to commons chunk for example. --- src/renderers/webgl/WebGLProgram.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/renderers/webgl/WebGLProgram.js b/src/renderers/webgl/WebGLProgram.js index 426d67a3606541..9340eff0f221d4 100644 --- a/src/renderers/webgl/WebGLProgram.js +++ b/src/renderers/webgl/WebGLProgram.js @@ -310,6 +310,7 @@ function WebGLProgram( renderer, code, material, parameters ) { } else { prefixVertex = [ + '#define IS_VERTEX', 'precision ' + parameters.precision + ' float;', 'precision ' + parameters.precision + ' int;', @@ -418,6 +419,8 @@ function WebGLProgram( renderer, code, material, parameters ) { customExtensions, + '#define IS_FRAGMENT', + 'precision ' + parameters.precision + ' float;', 'precision ' + parameters.precision + ' int;', From 643bfda9902aa16eee23ec285a6b3926dc68bf9f Mon Sep 17 00:00:00 2001 From: Dusan Bosnjak Date: Thu, 23 Mar 2017 16:07:24 -0700 Subject: [PATCH 08/17] Revert "add IS_VERTEX and IS_FRAGMENT to shader defines" This reverts commit e73c718cfe16d36b2fb0c4f57ae236b0c216865e. --- src/renderers/webgl/WebGLProgram.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/renderers/webgl/WebGLProgram.js b/src/renderers/webgl/WebGLProgram.js index 9340eff0f221d4..426d67a3606541 100644 --- a/src/renderers/webgl/WebGLProgram.js +++ b/src/renderers/webgl/WebGLProgram.js @@ -310,7 +310,6 @@ function WebGLProgram( renderer, code, material, parameters ) { } else { prefixVertex = [ - '#define IS_VERTEX', 'precision ' + parameters.precision + ' float;', 'precision ' + parameters.precision + ' int;', @@ -419,8 +418,6 @@ function WebGLProgram( renderer, code, material, parameters ) { customExtensions, - '#define IS_FRAGMENT', - 'precision ' + parameters.precision + ' float;', 'precision ' + parameters.precision + ' int;', From 311a7cd92e3ce0169287745cb354fc5d583b0d61 Mon Sep 17 00:00:00 2001 From: Dusan Bosnjak Date: Fri, 9 Jun 2017 18:13:20 -0700 Subject: [PATCH 09/17] comparison --- examples/webgl_materials_modified.html | 67 +++++++++++++++++++------- 1 file changed, 50 insertions(+), 17 deletions(-) diff --git a/examples/webgl_materials_modified.html b/examples/webgl_materials_modified.html index 0cd0ec48609841..f286466002d34e 100644 --- a/examples/webgl_materials_modified.html +++ b/examples/webgl_materials_modified.html @@ -91,26 +91,58 @@ scene = new THREE.Scene(); var material = new THREE.MeshNormalMaterial(); - material.onBeforeCompile = function ( shader ) { - // console.log( shader ) + // BEGIN custom shader injection ---- + + //same + var myShader = [ + 'float theta = sin( time + position.y ) / 2.0;', + 'float c = cos( theta );', + 'float s = sin( theta );', + 'mat3 m = mat3( c, 0, s, 0, 1, 0, -s, 0, c );', + 'vec3 transformed = vec3( position ) * m;', + 'vNormal = vNormal * m;' + ].join( '\n' ); + + //[D1] + material.shaderIncludes = { + begin_vertex: myShader, + + /**[D3] + * there could probably be a better way to inject + * outside of main(), but when this was written there + * were no good hooks. common is both in vert and frag + * uv_pars_vertex works as its present in most of the shaders + */ + uv_pars_vertex: [ + + THREE.ShaderChunk['uv_pars_vertex'], + "uniform float time;", + ].join('\n') + }; + + //[D2] this one needs an object literal to be created + material.shaderUniforms = { + time: { value: 0 } + }; + + materialShader = material; + + material.onBeforeCompile = function ( shader ) { - shader.uniforms.time = { value: 0 }; + //[D2] this one already has a uniforms object + // shader.uniforms.time = { value: 0 }; - shader.vertexShader = 'uniform float time;\n' + shader.vertexShader; - shader.vertexShader = shader.vertexShader.replace( - '#include ', - [ - 'float theta = sin( time + position.y ) / 2.0;', - 'float c = cos( theta );', - 'float s = sin( theta );', - 'mat3 m = mat3( c, 0, s, 0, 1, 0, -s, 0, c );', - 'vec3 transformed = vec3( position ) * m;', - 'vNormal = vNormal * m;' - ].join( '\n' ) - ); + //[D3] way better + // shader.vertexShader = 'uniform float time;\n' + shader.vertexShader; + + //[D1] tad more verbose? + // shader.vertexShader = shader.vertexShader.replace( + // '#include ', + // myShader + // ); - materialShader = shader; + // materialShader = shader; }; @@ -188,7 +220,8 @@ if ( materialShader ) { - materialShader.uniforms.time.value = performance.now() / 1000; + // materialShader.uniforms.time.value = performance.now() / 1000; + materialShader.shaderUniforms.time.value = performance.now() / 1000; } From 89b2dfaadd2d4f2304eb5674c2897d0b28e7aa97 Mon Sep 17 00:00:00 2001 From: Dusan Bosnjak Date: Sun, 11 Jun 2017 13:25:29 -0700 Subject: [PATCH 10/17] global GLSL hooks and auto uniform injection Add vertex_global and fragment_global chunks to the material templates Add custom uniform injection in WebGLRenderer --- examples/webgl_materials_modified.html | 38 +++++++++---------- src/renderers/WebGLRenderer.js | 18 ++++++++- src/renderers/shaders/ShaderChunk.js | 4 ++ .../shaders/ShaderChunk/global_fragment.glsl | 1 + .../shaders/ShaderChunk/global_vertex.glsl | 1 + .../shaders/ShaderLib/depth_frag.glsl | 1 + .../shaders/ShaderLib/depth_vert.glsl | 1 + .../shaders/ShaderLib/distanceRGBA_frag.glsl | 1 + .../shaders/ShaderLib/distanceRGBA_vert.glsl | 1 + .../shaders/ShaderLib/linedashed_frag.glsl | 1 + .../shaders/ShaderLib/linedashed_vert.glsl | 1 + .../shaders/ShaderLib/meshbasic_frag.glsl | 1 + .../shaders/ShaderLib/meshbasic_vert.glsl | 1 + .../shaders/ShaderLib/meshlambert_frag.glsl | 1 + .../shaders/ShaderLib/meshlambert_vert.glsl | 1 + .../shaders/ShaderLib/meshphong_frag.glsl | 1 + .../shaders/ShaderLib/meshphong_vert.glsl | 1 + .../shaders/ShaderLib/meshphysical_frag.glsl | 1 + .../shaders/ShaderLib/meshphysical_vert.glsl | 1 + .../shaders/ShaderLib/normal_frag.glsl | 1 + .../shaders/ShaderLib/normal_vert.glsl | 1 + .../shaders/ShaderLib/points_frag.glsl | 1 + .../shaders/ShaderLib/points_vert.glsl | 1 + 23 files changed, 59 insertions(+), 21 deletions(-) create mode 100644 src/renderers/shaders/ShaderChunk/global_fragment.glsl create mode 100644 src/renderers/shaders/ShaderChunk/global_vertex.glsl diff --git a/examples/webgl_materials_modified.html b/examples/webgl_materials_modified.html index f286466002d34e..a5f9a5f845e652 100644 --- a/examples/webgl_materials_modified.html +++ b/examples/webgl_materials_modified.html @@ -94,7 +94,6 @@ // BEGIN custom shader injection ---- - //same var myShader = [ 'float theta = sin( time + position.y ) / 2.0;', 'float c = cos( theta );', @@ -104,39 +103,38 @@ 'vNormal = vNormal * m;' ].join( '\n' ); - //[D1] material.shaderIncludes = { + begin_vertex: myShader, - /**[D3] - * there could probably be a better way to inject - * outside of main(), but when this was written there - * were no good hooks. common is both in vert and frag - * uv_pars_vertex works as its present in most of the shaders - */ - uv_pars_vertex: [ - - THREE.ShaderChunk['uv_pars_vertex'], - "uniform float time;", - ].join('\n') + global_vertex: 'uniform float time;\n' + }; - //[D2] this one needs an object literal to be created material.shaderUniforms = { - time: { value: 0 } + time: { value: 0 } }; + //OR + + // material.shaderIncludes = { + + // begin_vertex: myShader, + + // }; + + // material.shaderUniforms = { + // time: { value: 0 , type:'float' } //if type is provided the uniform will be injected automatically + // }; + materialShader = material; - material.onBeforeCompile = function ( shader ) { + // material.onBeforeCompile = function ( shader ) { - //[D2] this one already has a uniforms object // shader.uniforms.time = { value: 0 }; - //[D3] way better // shader.vertexShader = 'uniform float time;\n' + shader.vertexShader; - //[D1] tad more verbose? // shader.vertexShader = shader.vertexShader.replace( // '#include ', // myShader @@ -144,7 +142,7 @@ // materialShader = shader; - }; + // }; loader = new THREE.JSONLoader(); loader.load( "obj/leeperrysmith/LeePerrySmith.js", function( geometry ) { diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 8e57dacdecedee..3b82494e2b2a7f 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -1543,6 +1543,8 @@ function WebGLRenderer( parameters ) { if ( programChange ) { + var shaderUniformsGLSL = '' + if ( parameters.shaderID ) { var shader = ShaderLib[ parameters.shaderID ]; @@ -1551,10 +1553,24 @@ function WebGLRenderer( parameters ) { UniformsUtils.merge([ UniformsUtils.clone( shader.uniforms ) , material.shaderUniforms ]) : UniformsUtils.clone( shader.uniforms ); + //if shader uniforms are present + for ( var u in material.shaderUniforms ) { + + var uniform = material.shaderUniforms[ u ]; + var type = uniform.type; + + if ( type ) { + + shaderUniformsGLSL += 'uniform ' + type + ' ' + u + ';\n' + + } + + } + materialProperties.shader = { name: material.type, uniforms: computedUniforms, - vertexShader: shader.vertexShader, + vertexShader: shaderUniformsGLSL + shader.vertexShader, fragmentShader: shader.fragmentShader }; diff --git a/src/renderers/shaders/ShaderChunk.js b/src/renderers/shaders/ShaderChunk.js index 97583490a503e0..7c12da0b152493 100644 --- a/src/renderers/shaders/ShaderChunk.js +++ b/src/renderers/shaders/ShaderChunk.js @@ -32,6 +32,8 @@ import fog_vertex from './ShaderChunk/fog_vertex.glsl'; import fog_pars_vertex from './ShaderChunk/fog_pars_vertex.glsl'; import fog_fragment from './ShaderChunk/fog_fragment.glsl'; import fog_pars_fragment from './ShaderChunk/fog_pars_fragment.glsl'; +import global_fragment from './ShaderChunk/global_fragment.glsl'; +import global_vertex from './ShaderChunk/global_vertex.glsl'; import gradientmap_pars_fragment from './ShaderChunk/gradientmap_pars_fragment.glsl'; import lightmap_fragment from './ShaderChunk/lightmap_fragment.glsl'; import lightmap_pars_fragment from './ShaderChunk/lightmap_pars_fragment.glsl'; @@ -145,6 +147,8 @@ export var ShaderChunk = { fog_pars_vertex: fog_pars_vertex, fog_fragment: fog_fragment, fog_pars_fragment: fog_pars_fragment, + global_fragment: global_fragment, + global_vertex: global_vertex, gradientmap_pars_fragment: gradientmap_pars_fragment, lightmap_fragment: lightmap_fragment, lightmap_pars_fragment: lightmap_pars_fragment, diff --git a/src/renderers/shaders/ShaderChunk/global_fragment.glsl b/src/renderers/shaders/ShaderChunk/global_fragment.glsl new file mode 100644 index 00000000000000..9b719e45bf7674 --- /dev/null +++ b/src/renderers/shaders/ShaderChunk/global_fragment.glsl @@ -0,0 +1 @@ +// template for injecting varying, uniform and functions above main below other includes \ No newline at end of file diff --git a/src/renderers/shaders/ShaderChunk/global_vertex.glsl b/src/renderers/shaders/ShaderChunk/global_vertex.glsl new file mode 100644 index 00000000000000..768496dc72ee03 --- /dev/null +++ b/src/renderers/shaders/ShaderChunk/global_vertex.glsl @@ -0,0 +1 @@ +// template for injecting varying, uniform , attributes and functions above main below other includes \ No newline at end of file diff --git a/src/renderers/shaders/ShaderLib/depth_frag.glsl b/src/renderers/shaders/ShaderLib/depth_frag.glsl index 4078a9c68fe797..ebe5c00429bbfc 100644 --- a/src/renderers/shaders/ShaderLib/depth_frag.glsl +++ b/src/renderers/shaders/ShaderLib/depth_frag.glsl @@ -11,6 +11,7 @@ #include #include #include +#include void main() { diff --git a/src/renderers/shaders/ShaderLib/depth_vert.glsl b/src/renderers/shaders/ShaderLib/depth_vert.glsl index 590184a0d88a29..f3c34373e61308 100644 --- a/src/renderers/shaders/ShaderLib/depth_vert.glsl +++ b/src/renderers/shaders/ShaderLib/depth_vert.glsl @@ -5,6 +5,7 @@ #include #include #include +#include void main() { diff --git a/src/renderers/shaders/ShaderLib/distanceRGBA_frag.glsl b/src/renderers/shaders/ShaderLib/distanceRGBA_frag.glsl index 22875fd3add12f..fc49fb6e1a6cfd 100644 --- a/src/renderers/shaders/ShaderLib/distanceRGBA_frag.glsl +++ b/src/renderers/shaders/ShaderLib/distanceRGBA_frag.glsl @@ -4,6 +4,7 @@ varying vec4 vWorldPosition; #include #include #include +#include void main () { diff --git a/src/renderers/shaders/ShaderLib/distanceRGBA_vert.glsl b/src/renderers/shaders/ShaderLib/distanceRGBA_vert.glsl index 445102be1fb8ea..70cd6e5c2495e1 100644 --- a/src/renderers/shaders/ShaderLib/distanceRGBA_vert.glsl +++ b/src/renderers/shaders/ShaderLib/distanceRGBA_vert.glsl @@ -4,6 +4,7 @@ varying vec4 vWorldPosition; #include #include #include +#include void main() { diff --git a/src/renderers/shaders/ShaderLib/linedashed_frag.glsl b/src/renderers/shaders/ShaderLib/linedashed_frag.glsl index 3c93173641c085..cb866c32b50708 100644 --- a/src/renderers/shaders/ShaderLib/linedashed_frag.glsl +++ b/src/renderers/shaders/ShaderLib/linedashed_frag.glsl @@ -11,6 +11,7 @@ varying float vLineDistance; #include #include #include +#include void main() { diff --git a/src/renderers/shaders/ShaderLib/linedashed_vert.glsl b/src/renderers/shaders/ShaderLib/linedashed_vert.glsl index 5d7057dbf1d623..980e7803e1a336 100644 --- a/src/renderers/shaders/ShaderLib/linedashed_vert.glsl +++ b/src/renderers/shaders/ShaderLib/linedashed_vert.glsl @@ -8,6 +8,7 @@ varying float vLineDistance; #include #include #include +#include void main() { diff --git a/src/renderers/shaders/ShaderLib/meshbasic_frag.glsl b/src/renderers/shaders/ShaderLib/meshbasic_frag.glsl index 5858ea7ce91204..37e4ac1cdcb00c 100644 --- a/src/renderers/shaders/ShaderLib/meshbasic_frag.glsl +++ b/src/renderers/shaders/ShaderLib/meshbasic_frag.glsl @@ -20,6 +20,7 @@ uniform float opacity; #include #include #include +#include void main() { diff --git a/src/renderers/shaders/ShaderLib/meshbasic_vert.glsl b/src/renderers/shaders/ShaderLib/meshbasic_vert.glsl index 20f3c15cbfe6bd..0e51bd7160cf4f 100644 --- a/src/renderers/shaders/ShaderLib/meshbasic_vert.glsl +++ b/src/renderers/shaders/ShaderLib/meshbasic_vert.glsl @@ -8,6 +8,7 @@ #include #include #include +#include void main() { diff --git a/src/renderers/shaders/ShaderLib/meshlambert_frag.glsl b/src/renderers/shaders/ShaderLib/meshlambert_frag.glsl index 9698f0bb7b3c81..01be7d45f16977 100644 --- a/src/renderers/shaders/ShaderLib/meshlambert_frag.glsl +++ b/src/renderers/shaders/ShaderLib/meshlambert_frag.glsl @@ -30,6 +30,7 @@ varying vec3 vLightFront; #include #include #include +#include void main() { diff --git a/src/renderers/shaders/ShaderLib/meshlambert_vert.glsl b/src/renderers/shaders/ShaderLib/meshlambert_vert.glsl index 2498399bc05577..09bacb0a359bc6 100644 --- a/src/renderers/shaders/ShaderLib/meshlambert_vert.glsl +++ b/src/renderers/shaders/ShaderLib/meshlambert_vert.glsl @@ -21,6 +21,7 @@ varying vec3 vLightFront; #include #include #include +#include void main() { diff --git a/src/renderers/shaders/ShaderLib/meshphong_frag.glsl b/src/renderers/shaders/ShaderLib/meshphong_frag.glsl index 5b4f25a775a98e..78cff18bf506d0 100644 --- a/src/renderers/shaders/ShaderLib/meshphong_frag.glsl +++ b/src/renderers/shaders/ShaderLib/meshphong_frag.glsl @@ -29,6 +29,7 @@ uniform float opacity; #include #include #include +#include void main() { diff --git a/src/renderers/shaders/ShaderLib/meshphong_vert.glsl b/src/renderers/shaders/ShaderLib/meshphong_vert.glsl index e7d2f1648091f4..1427893f4f1124 100644 --- a/src/renderers/shaders/ShaderLib/meshphong_vert.glsl +++ b/src/renderers/shaders/ShaderLib/meshphong_vert.glsl @@ -20,6 +20,7 @@ varying vec3 vViewPosition; #include #include #include +#include void main() { diff --git a/src/renderers/shaders/ShaderLib/meshphysical_frag.glsl b/src/renderers/shaders/ShaderLib/meshphysical_frag.glsl index b11b90403d9114..8252fa4de61b29 100644 --- a/src/renderers/shaders/ShaderLib/meshphysical_frag.glsl +++ b/src/renderers/shaders/ShaderLib/meshphysical_frag.glsl @@ -43,6 +43,7 @@ varying vec3 vViewPosition; #include #include #include +#include void main() { diff --git a/src/renderers/shaders/ShaderLib/meshphysical_vert.glsl b/src/renderers/shaders/ShaderLib/meshphysical_vert.glsl index 2c7fd44812b84c..d734741a2b85e7 100644 --- a/src/renderers/shaders/ShaderLib/meshphysical_vert.glsl +++ b/src/renderers/shaders/ShaderLib/meshphysical_vert.glsl @@ -19,6 +19,7 @@ varying vec3 vViewPosition; #include #include #include +#include void main() { diff --git a/src/renderers/shaders/ShaderLib/normal_frag.glsl b/src/renderers/shaders/ShaderLib/normal_frag.glsl index 11c2144a4ba27e..303dd888762ca5 100644 --- a/src/renderers/shaders/ShaderLib/normal_frag.glsl +++ b/src/renderers/shaders/ShaderLib/normal_frag.glsl @@ -19,6 +19,7 @@ uniform float opacity; #include #include #include +#include void main() { diff --git a/src/renderers/shaders/ShaderLib/normal_vert.glsl b/src/renderers/shaders/ShaderLib/normal_vert.glsl index 1ae8ba75661ce2..470bae04a5a5c1 100644 --- a/src/renderers/shaders/ShaderLib/normal_vert.glsl +++ b/src/renderers/shaders/ShaderLib/normal_vert.glsl @@ -17,6 +17,7 @@ #include #include #include +#include void main() { diff --git a/src/renderers/shaders/ShaderLib/points_frag.glsl b/src/renderers/shaders/ShaderLib/points_frag.glsl index f42755951722e7..11c48131a04ec4 100644 --- a/src/renderers/shaders/ShaderLib/points_frag.glsl +++ b/src/renderers/shaders/ShaderLib/points_frag.glsl @@ -9,6 +9,7 @@ uniform float opacity; #include #include #include +#include void main() { diff --git a/src/renderers/shaders/ShaderLib/points_vert.glsl b/src/renderers/shaders/ShaderLib/points_vert.glsl index a3cb26d2d32c84..2fbe8870c44c2e 100644 --- a/src/renderers/shaders/ShaderLib/points_vert.glsl +++ b/src/renderers/shaders/ShaderLib/points_vert.glsl @@ -7,6 +7,7 @@ uniform float scale; #include #include #include +#include void main() { From 879d52349bd5ef72c64fc962d8ca26bacaf489bf Mon Sep 17 00:00:00 2001 From: Dusan Bosnjak Date: Mon, 12 Jun 2017 10:29:56 -0700 Subject: [PATCH 11/17] inject auto u niforms into frag --- src/renderers/WebGLRenderer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 3b82494e2b2a7f..ac5f5d0df3e999 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -1571,7 +1571,7 @@ function WebGLRenderer( parameters ) { name: material.type, uniforms: computedUniforms, vertexShader: shaderUniformsGLSL + shader.vertexShader, - fragmentShader: shader.fragmentShader + fragmentShader: shaderUniformsGLSL + shader.fragmentShader }; } else { From af667deb5e9932e4d686dd13287b77b3d458524f Mon Sep 17 00:00:00 2001 From: Dusan Bosnjak Date: Mon, 29 Jan 2018 11:38:33 -0800 Subject: [PATCH 12/17] remove global hooks --- src/renderers/shaders/ShaderLib/depth_frag.glsl | 1 - src/renderers/shaders/ShaderLib/depth_vert.glsl | 1 - src/renderers/shaders/ShaderLib/distanceRGBA_frag.glsl | 1 - src/renderers/shaders/ShaderLib/distanceRGBA_vert.glsl | 1 - src/renderers/shaders/ShaderLib/linedashed_frag.glsl | 1 - src/renderers/shaders/ShaderLib/linedashed_vert.glsl | 1 - src/renderers/shaders/ShaderLib/meshbasic_frag.glsl | 1 - src/renderers/shaders/ShaderLib/meshbasic_vert.glsl | 1 - src/renderers/shaders/ShaderLib/meshlambert_frag.glsl | 1 - src/renderers/shaders/ShaderLib/meshlambert_vert.glsl | 1 - src/renderers/shaders/ShaderLib/meshphong_frag.glsl | 1 - src/renderers/shaders/ShaderLib/meshphong_vert.glsl | 1 - src/renderers/shaders/ShaderLib/meshphysical_frag.glsl | 1 - src/renderers/shaders/ShaderLib/meshphysical_vert.glsl | 1 - src/renderers/shaders/ShaderLib/normal_frag.glsl | 1 - src/renderers/shaders/ShaderLib/normal_vert.glsl | 1 - src/renderers/shaders/ShaderLib/points_frag.glsl | 1 - src/renderers/shaders/ShaderLib/points_vert.glsl | 1 - 18 files changed, 18 deletions(-) diff --git a/src/renderers/shaders/ShaderLib/depth_frag.glsl b/src/renderers/shaders/ShaderLib/depth_frag.glsl index ebe5c00429bbfc..4078a9c68fe797 100644 --- a/src/renderers/shaders/ShaderLib/depth_frag.glsl +++ b/src/renderers/shaders/ShaderLib/depth_frag.glsl @@ -11,7 +11,6 @@ #include #include #include -#include void main() { diff --git a/src/renderers/shaders/ShaderLib/depth_vert.glsl b/src/renderers/shaders/ShaderLib/depth_vert.glsl index 95c77b8eaccffd..edf12fb744183b 100644 --- a/src/renderers/shaders/ShaderLib/depth_vert.glsl +++ b/src/renderers/shaders/ShaderLib/depth_vert.glsl @@ -5,7 +5,6 @@ #include #include #include -#include void main() { diff --git a/src/renderers/shaders/ShaderLib/distanceRGBA_frag.glsl b/src/renderers/shaders/ShaderLib/distanceRGBA_frag.glsl index 9246cca52c951d..8dbf8f401106d1 100644 --- a/src/renderers/shaders/ShaderLib/distanceRGBA_frag.glsl +++ b/src/renderers/shaders/ShaderLib/distanceRGBA_frag.glsl @@ -11,7 +11,6 @@ varying vec3 vWorldPosition; #include #include #include -#include void main () { diff --git a/src/renderers/shaders/ShaderLib/distanceRGBA_vert.glsl b/src/renderers/shaders/ShaderLib/distanceRGBA_vert.glsl index 2839addbbbfe28..abecdefa7fc0c2 100644 --- a/src/renderers/shaders/ShaderLib/distanceRGBA_vert.glsl +++ b/src/renderers/shaders/ShaderLib/distanceRGBA_vert.glsl @@ -8,7 +8,6 @@ varying vec3 vWorldPosition; #include #include #include -#include void main() { diff --git a/src/renderers/shaders/ShaderLib/linedashed_frag.glsl b/src/renderers/shaders/ShaderLib/linedashed_frag.glsl index cb866c32b50708..3c93173641c085 100644 --- a/src/renderers/shaders/ShaderLib/linedashed_frag.glsl +++ b/src/renderers/shaders/ShaderLib/linedashed_frag.glsl @@ -11,7 +11,6 @@ varying float vLineDistance; #include #include #include -#include void main() { diff --git a/src/renderers/shaders/ShaderLib/linedashed_vert.glsl b/src/renderers/shaders/ShaderLib/linedashed_vert.glsl index 980e7803e1a336..5d7057dbf1d623 100644 --- a/src/renderers/shaders/ShaderLib/linedashed_vert.glsl +++ b/src/renderers/shaders/ShaderLib/linedashed_vert.glsl @@ -8,7 +8,6 @@ varying float vLineDistance; #include #include #include -#include void main() { diff --git a/src/renderers/shaders/ShaderLib/meshbasic_frag.glsl b/src/renderers/shaders/ShaderLib/meshbasic_frag.glsl index 56ecf6c28e59f1..f0bc5397258a33 100644 --- a/src/renderers/shaders/ShaderLib/meshbasic_frag.glsl +++ b/src/renderers/shaders/ShaderLib/meshbasic_frag.glsl @@ -20,7 +20,6 @@ uniform float opacity; #include #include #include -#include void main() { diff --git a/src/renderers/shaders/ShaderLib/meshbasic_vert.glsl b/src/renderers/shaders/ShaderLib/meshbasic_vert.glsl index 0e51bd7160cf4f..20f3c15cbfe6bd 100644 --- a/src/renderers/shaders/ShaderLib/meshbasic_vert.glsl +++ b/src/renderers/shaders/ShaderLib/meshbasic_vert.glsl @@ -8,7 +8,6 @@ #include #include #include -#include void main() { diff --git a/src/renderers/shaders/ShaderLib/meshlambert_frag.glsl b/src/renderers/shaders/ShaderLib/meshlambert_frag.glsl index 8063aaf9eb0d92..aeb9571696b8bd 100644 --- a/src/renderers/shaders/ShaderLib/meshlambert_frag.glsl +++ b/src/renderers/shaders/ShaderLib/meshlambert_frag.glsl @@ -30,7 +30,6 @@ varying vec3 vLightFront; #include #include #include -#include void main() { diff --git a/src/renderers/shaders/ShaderLib/meshlambert_vert.glsl b/src/renderers/shaders/ShaderLib/meshlambert_vert.glsl index 09bacb0a359bc6..2498399bc05577 100644 --- a/src/renderers/shaders/ShaderLib/meshlambert_vert.glsl +++ b/src/renderers/shaders/ShaderLib/meshlambert_vert.glsl @@ -21,7 +21,6 @@ varying vec3 vLightFront; #include #include #include -#include void main() { diff --git a/src/renderers/shaders/ShaderLib/meshphong_frag.glsl b/src/renderers/shaders/ShaderLib/meshphong_frag.glsl index 377a6ae9076b9d..0bf233740a6aec 100644 --- a/src/renderers/shaders/ShaderLib/meshphong_frag.glsl +++ b/src/renderers/shaders/ShaderLib/meshphong_frag.glsl @@ -29,7 +29,6 @@ uniform float opacity; #include #include #include -#include void main() { diff --git a/src/renderers/shaders/ShaderLib/meshphong_vert.glsl b/src/renderers/shaders/ShaderLib/meshphong_vert.glsl index 79b9233eef9bbb..e79d5fe416750c 100644 --- a/src/renderers/shaders/ShaderLib/meshphong_vert.glsl +++ b/src/renderers/shaders/ShaderLib/meshphong_vert.glsl @@ -20,7 +20,6 @@ varying vec3 vViewPosition; #include #include #include -#include void main() { diff --git a/src/renderers/shaders/ShaderLib/meshphysical_frag.glsl b/src/renderers/shaders/ShaderLib/meshphysical_frag.glsl index e2074314fe2543..a66b04c764e86d 100644 --- a/src/renderers/shaders/ShaderLib/meshphysical_frag.glsl +++ b/src/renderers/shaders/ShaderLib/meshphysical_frag.glsl @@ -43,7 +43,6 @@ varying vec3 vViewPosition; #include #include #include -#include void main() { diff --git a/src/renderers/shaders/ShaderLib/meshphysical_vert.glsl b/src/renderers/shaders/ShaderLib/meshphysical_vert.glsl index 388b59f94f1892..4dbc2d41e02811 100644 --- a/src/renderers/shaders/ShaderLib/meshphysical_vert.glsl +++ b/src/renderers/shaders/ShaderLib/meshphysical_vert.glsl @@ -19,7 +19,6 @@ varying vec3 vViewPosition; #include #include #include -#include void main() { diff --git a/src/renderers/shaders/ShaderLib/normal_frag.glsl b/src/renderers/shaders/ShaderLib/normal_frag.glsl index 0db7fad86d8609..705efad90964f2 100644 --- a/src/renderers/shaders/ShaderLib/normal_frag.glsl +++ b/src/renderers/shaders/ShaderLib/normal_frag.glsl @@ -19,7 +19,6 @@ uniform float opacity; #include #include #include -#include void main() { diff --git a/src/renderers/shaders/ShaderLib/normal_vert.glsl b/src/renderers/shaders/ShaderLib/normal_vert.glsl index f464063db234bc..034d580c983e27 100644 --- a/src/renderers/shaders/ShaderLib/normal_vert.glsl +++ b/src/renderers/shaders/ShaderLib/normal_vert.glsl @@ -17,7 +17,6 @@ #include #include #include -#include void main() { diff --git a/src/renderers/shaders/ShaderLib/points_frag.glsl b/src/renderers/shaders/ShaderLib/points_frag.glsl index 11c48131a04ec4..f42755951722e7 100644 --- a/src/renderers/shaders/ShaderLib/points_frag.glsl +++ b/src/renderers/shaders/ShaderLib/points_frag.glsl @@ -9,7 +9,6 @@ uniform float opacity; #include #include #include -#include void main() { diff --git a/src/renderers/shaders/ShaderLib/points_vert.glsl b/src/renderers/shaders/ShaderLib/points_vert.glsl index 2fbe8870c44c2e..a3cb26d2d32c84 100644 --- a/src/renderers/shaders/ShaderLib/points_vert.glsl +++ b/src/renderers/shaders/ShaderLib/points_vert.glsl @@ -7,7 +7,6 @@ uniform float scale; #include #include #include -#include void main() { From e63301c04350c9d71d2c025a6c4dc60f8d4c8ff0 Mon Sep 17 00:00:00 2001 From: Dusan Bosnjak Date: Mon, 29 Jan 2018 12:51:50 -0800 Subject: [PATCH 13/17] Fix and comment --- src/renderers/WebGLRenderer.js | 20 +++++++++++-------- src/renderers/shaders/ShaderChunk.js | 4 ---- .../shaders/ShaderChunk/global_fragment.glsl | 1 - .../shaders/ShaderChunk/global_vertex.glsl | 1 - src/renderers/webgl/WebGLProgram.js | 12 ++++++----- src/renderers/webgl/WebGLPrograms.js | 2 ++ 6 files changed, 21 insertions(+), 19 deletions(-) delete mode 100644 src/renderers/shaders/ShaderChunk/global_fragment.glsl delete mode 100644 src/renderers/shaders/ShaderChunk/global_vertex.glsl diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 211acd181754f7..2e8eab81488b1e 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -1496,34 +1496,38 @@ function WebGLRenderer( parameters ) { if ( programChange ) { - var shaderUniformsGLSL = '' if ( parameters.shaderID ) { var shader = ShaderLib[ parameters.shaderID ]; + //if any extra uniforms are provided, merge them with the others var computedUniforms = undefined !== material.shaderUniforms ? UniformsUtils.merge([ UniformsUtils.clone( shader.uniforms ) , material.shaderUniforms ]) : UniformsUtils.clone( shader.uniforms ); - //if shader uniforms are present - for ( var u in material.shaderUniforms ) { + //if the uniform is provided with { value , type } inject this GLSL automatically + //(no need to write `uniform float uFoo;` and include manually in a snippet) + var shaderUniformsGLSL = ''; //collect the GLSL in here - var uniform = material.shaderUniforms[ u ]; - var type = uniform.type; + for ( var uniformName in material.shaderUniforms ) { + + var type = material.shaderUniforms[ uniformName ].type; if ( type ) { - shaderUniformsGLSL += 'uniform ' + type + ' ' + u + ';\n' + shaderUniformsGLSL += 'uniform ' + type + ' ' + uniformName + ';\n' } } - + + //inject these here, maybe this is a bad idea + //because they end up in both vert and frag materialProperties.shader = { name: material.type, uniforms: computedUniforms, - vertexShader: shaderUniformsGLSL + shader.vertexShader, + vertexShader: shaderUniformsGLSL + shader.vertexShader, fragmentShader: shaderUniformsGLSL + shader.fragmentShader }; diff --git a/src/renderers/shaders/ShaderChunk.js b/src/renderers/shaders/ShaderChunk.js index 39b46b91faab06..92b3840d782c01 100644 --- a/src/renderers/shaders/ShaderChunk.js +++ b/src/renderers/shaders/ShaderChunk.js @@ -32,8 +32,6 @@ import fog_vertex from './ShaderChunk/fog_vertex.glsl'; import fog_pars_vertex from './ShaderChunk/fog_pars_vertex.glsl'; import fog_fragment from './ShaderChunk/fog_fragment.glsl'; import fog_pars_fragment from './ShaderChunk/fog_pars_fragment.glsl'; -import global_fragment from './ShaderChunk/global_fragment.glsl'; -import global_vertex from './ShaderChunk/global_vertex.glsl'; import gradientmap_pars_fragment from './ShaderChunk/gradientmap_pars_fragment.glsl'; import lightmap_fragment from './ShaderChunk/lightmap_fragment.glsl'; import lightmap_pars_fragment from './ShaderChunk/lightmap_pars_fragment.glsl'; @@ -146,8 +144,6 @@ export var ShaderChunk = { fog_pars_vertex: fog_pars_vertex, fog_fragment: fog_fragment, fog_pars_fragment: fog_pars_fragment, - global_fragment: global_fragment, - global_vertex: global_vertex, gradientmap_pars_fragment: gradientmap_pars_fragment, lightmap_fragment: lightmap_fragment, lightmap_pars_fragment: lightmap_pars_fragment, diff --git a/src/renderers/shaders/ShaderChunk/global_fragment.glsl b/src/renderers/shaders/ShaderChunk/global_fragment.glsl deleted file mode 100644 index 9b719e45bf7674..00000000000000 --- a/src/renderers/shaders/ShaderChunk/global_fragment.glsl +++ /dev/null @@ -1 +0,0 @@ -// template for injecting varying, uniform and functions above main below other includes \ No newline at end of file diff --git a/src/renderers/shaders/ShaderChunk/global_vertex.glsl b/src/renderers/shaders/ShaderChunk/global_vertex.glsl deleted file mode 100644 index 768496dc72ee03..00000000000000 --- a/src/renderers/shaders/ShaderChunk/global_vertex.glsl +++ /dev/null @@ -1 +0,0 @@ -// template for injecting varying, uniform , attributes and functions above main below other includes \ No newline at end of file diff --git a/src/renderers/webgl/WebGLProgram.js b/src/renderers/webgl/WebGLProgram.js index 1f60e4321a7e83..3608f7211ebf6b 100644 --- a/src/renderers/webgl/WebGLProgram.js +++ b/src/renderers/webgl/WebGLProgram.js @@ -150,13 +150,16 @@ function replaceLightNums( string, parameters ) { } -function parseIncludes( string , materialIncludes ) { +function parseIncludes( string, materialIncludes ) { var pattern = /^[ \t]*#include +<([\w\d.]+)>/gm; function replace( match, include ) { - var replace = undefined !== materialIncludes[ include ] ? materialIncludes[ include ] : ShaderChunk[ include ]; + //if there are material includes provided use those instead of the default chunks + var replace = undefined !== materialIncludes[ include ] ? + materialIncludes[ include ] : + ShaderChunk[ include ]; if ( replace === undefined ) { @@ -201,7 +204,7 @@ function WebGLProgram( renderer, extensions, code, material, shader, parameters var defines = material.defines; - var materialIncludes = material.shaderIncludes; + var materialIncludes = material.shaderIncludes; //custom chunks var vertexShader = shader.vertexShader; var fragmentShader = shader.fragmentShader; @@ -284,7 +287,7 @@ function WebGLProgram( renderer, extensions, code, material, shader, parameters var customDefines = generateDefines( defines ); - var customIncludes = undefined !== materialIncludes ? materialIncludes : {}; + var customIncludes = undefined !== materialIncludes ? materialIncludes : {}; //user is not aware of this feature, fine // @@ -509,7 +512,6 @@ function WebGLProgram( renderer, extensions, code, material, shader, parameters vertexShader = replaceLightNums( vertexShader, parameters ); fragmentShader = parseIncludes( fragmentShader, customIncludes ); - fragmentShader = replaceLightNums( fragmentShader, parameters ); if ( ! material.isShaderMaterial ) { diff --git a/src/renderers/webgl/WebGLPrograms.js b/src/renderers/webgl/WebGLPrograms.js index 86262f8b6711f0..5d2574de40e8eb 100644 --- a/src/renderers/webgl/WebGLPrograms.js +++ b/src/renderers/webgl/WebGLPrograms.js @@ -241,10 +241,12 @@ function WebGLPrograms( renderer, extensions, capabilities ) { } + // if the user is aware of the feature and added a dictionary if ( material.shaderIncludes !== undefined ){ for( var include in material.shaderIncludes ){ + //do proper hashing, onBeforeCompile.toString() had some issues array.push( material.shaderIncludes[ include ] ); } From 6c62ed9618a74fab727f465f4953aa9563473c6a Mon Sep 17 00:00:00 2001 From: Dusan Bosnjak Date: Mon, 29 Jan 2018 14:47:24 -0800 Subject: [PATCH 14/17] clean --- src/renderers/WebGLRenderer.js | 23 +++++++++++------------ src/renderers/webgl/WebGLProgram.js | 4 +++- src/renderers/webgl/WebGLPrograms.js | 6 +++--- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 2e8eab81488b1e..681911668cc1b0 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -1496,18 +1496,19 @@ function WebGLRenderer( parameters ) { if ( programChange ) { - if ( parameters.shaderID ) { var shader = ShaderLib[ parameters.shaderID ]; - //if any extra uniforms are provided, merge them with the others + // 1. if any extra uniforms are provided, merge them with the others + var computedUniforms = undefined !== material.shaderUniforms ? - UniformsUtils.merge([ UniformsUtils.clone( shader.uniforms ) , material.shaderUniforms ]) : + UniformsUtils.merge([ UniformsUtils.clone( shader.uniforms ), material.shaderUniforms ]) : UniformsUtils.clone( shader.uniforms ); - //if the uniform is provided with { value , type } inject this GLSL automatically - //(no need to write `uniform float uFoo;` and include manually in a snippet) + // if the uniform is provided with { value , type } inject this GLSL automatically + // (no need to write `uniform float uFoo;` and include manually in a snippet) + // which may be a poor idea because they would get injected into both vert and frag var shaderUniformsGLSL = ''; //collect the GLSL in here for ( var uniformName in material.shaderUniforms ) { @@ -1521,9 +1522,7 @@ function WebGLRenderer( parameters ) { } } - - //inject these here, maybe this is a bad idea - //because they end up in both vert and frag + materialProperties.shader = { name: material.type, uniforms: computedUniforms, @@ -1846,9 +1845,9 @@ function WebGLRenderer( parameters ) { } - //follow the same pattern with common uniforms - - //refreshUniformsCommon looks at some known uniforms and refreshes them - //refreshUniformsCustom should look at unknown uniforms but in a known place + //2. follow the same pattern with common uniforms - + // refreshUniformsCommon looks at some known uniforms and refreshes them + // refreshUniformsCustom should look at unknown uniforms but in a known place if ( undefined !== material.shaderUniforms ) { @@ -2097,7 +2096,7 @@ function WebGLRenderer( parameters ) { } - //same pattern as refreshUniformsFOO + //3. same pattern as refreshUniformsFOO function refreshUniformsCustom( uniforms, material ) { for ( var uniform in material.shaderUniforms ) { diff --git a/src/renderers/webgl/WebGLProgram.js b/src/renderers/webgl/WebGLProgram.js index 3608f7211ebf6b..4e49f113e90cd7 100644 --- a/src/renderers/webgl/WebGLProgram.js +++ b/src/renderers/webgl/WebGLProgram.js @@ -150,13 +150,14 @@ function replaceLightNums( string, parameters ) { } +//4. allow parsing of a custom dictionary, not just THREE.ShaderChunk function parseIncludes( string, materialIncludes ) { var pattern = /^[ \t]*#include +<([\w\d.]+)>/gm; function replace( match, include ) { - //if there are material includes provided use those instead of the default chunks + //if there are material includes provided use those instead of the default chunks: var replace = undefined !== materialIncludes[ include ] ? materialIncludes[ include ] : ShaderChunk[ include ]; @@ -508,6 +509,7 @@ function WebGLProgram( renderer, extensions, code, material, shader, parameters } + //4. provide optional chunk dictionary vertexShader = parseIncludes( vertexShader, customIncludes ); vertexShader = replaceLightNums( vertexShader, parameters ); diff --git a/src/renderers/webgl/WebGLPrograms.js b/src/renderers/webgl/WebGLPrograms.js index 5d2574de40e8eb..c2bb548ba32522 100644 --- a/src/renderers/webgl/WebGLPrograms.js +++ b/src/renderers/webgl/WebGLPrograms.js @@ -241,12 +241,12 @@ function WebGLPrograms( renderer, extensions, capabilities ) { } - // if the user is aware of the feature and added a dictionary + //5. if the user is aware of the feature and added a dictionary if ( material.shaderIncludes !== undefined ){ - for( var include in material.shaderIncludes ){ + for ( var include in material.shaderIncludes ){ - //do proper hashing, onBeforeCompile.toString() had some issues + //5. do proper hashing, onBeforeCompile.toString() had some issues array.push( material.shaderIncludes[ include ] ); } From 01057a64bb9daa2bacff7baac6d04a9b1413adf5 Mon Sep 17 00:00:00 2001 From: Dusan Bosnjak Date: Mon, 29 Jan 2018 15:11:44 -0800 Subject: [PATCH 15/17] Fix example --- examples/webgl_materials_modified.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/webgl_materials_modified.html b/examples/webgl_materials_modified.html index a5f9a5f845e652..84838a133684a7 100644 --- a/examples/webgl_materials_modified.html +++ b/examples/webgl_materials_modified.html @@ -107,7 +107,7 @@ begin_vertex: myShader, - global_vertex: 'uniform float time;\n' + uv_pars_vertex: THREE.ShaderChunk.uv_pars_vertex + '\nuniform float time;\n' }; From 3aed277faee70412d82f34f9926b51d01f2ac20b Mon Sep 17 00:00:00 2001 From: Dusan Bosnjak Date: Mon, 29 Jan 2018 19:24:54 -0800 Subject: [PATCH 16/17] kill uniform injection --- src/renderers/WebGLRenderer.js | 31 ++++------------------------ src/renderers/webgl/WebGLProgram.js | 11 ++++------ src/renderers/webgl/WebGLPrograms.js | 8 +++---- 3 files changed, 12 insertions(+), 38 deletions(-) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 681911668cc1b0..f00de74ad1d30a 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -1500,34 +1500,11 @@ function WebGLRenderer( parameters ) { var shader = ShaderLib[ parameters.shaderID ]; - // 1. if any extra uniforms are provided, merge them with the others - - var computedUniforms = undefined !== material.shaderUniforms ? - UniformsUtils.merge([ UniformsUtils.clone( shader.uniforms ), material.shaderUniforms ]) : - UniformsUtils.clone( shader.uniforms ); - - // if the uniform is provided with { value , type } inject this GLSL automatically - // (no need to write `uniform float uFoo;` and include manually in a snippet) - // which may be a poor idea because they would get injected into both vert and frag - var shaderUniformsGLSL = ''; //collect the GLSL in here - - for ( var uniformName in material.shaderUniforms ) { - - var type = material.shaderUniforms[ uniformName ].type; - - if ( type ) { - - shaderUniformsGLSL += 'uniform ' + type + ' ' + uniformName + ';\n' - - } - - } - materialProperties.shader = { name: material.type, - uniforms: computedUniforms, - vertexShader: shaderUniformsGLSL + shader.vertexShader, - fragmentShader: shaderUniformsGLSL + shader.fragmentShader + uniforms: UniformsUtils.clone( shader.uniforms ), + vertexShader: shader.vertexShader, + fragmentShader: shader.fragmentShader }; } else { @@ -2096,7 +2073,7 @@ function WebGLRenderer( parameters ) { } - //3. same pattern as refreshUniformsFOO + //2. same pattern as refreshUniformsFoobar function refreshUniformsCustom( uniforms, material ) { for ( var uniform in material.shaderUniforms ) { diff --git a/src/renderers/webgl/WebGLProgram.js b/src/renderers/webgl/WebGLProgram.js index 4e49f113e90cd7..a4883a00644c81 100644 --- a/src/renderers/webgl/WebGLProgram.js +++ b/src/renderers/webgl/WebGLProgram.js @@ -150,17 +150,15 @@ function replaceLightNums( string, parameters ) { } -//4. allow parsing of a custom dictionary, not just THREE.ShaderChunk +//3. allow parsing of a custom dictionary, not just THREE.ShaderChunk function parseIncludes( string, materialIncludes ) { var pattern = /^[ \t]*#include +<([\w\d.]+)>/gm; function replace( match, include ) { - //if there are material includes provided use those instead of the default chunks: - var replace = undefined !== materialIncludes[ include ] ? - materialIncludes[ include ] : - ShaderChunk[ include ]; + //3. if there are material includes provided use those instead of the default chunks: + var replace = undefined !== materialIncludes[ include ] ? materialIncludes[ include ] : ShaderChunk[ include ]; if ( replace === undefined ) { @@ -204,7 +202,6 @@ function WebGLProgram( renderer, extensions, code, material, shader, parameters var defines = material.defines; - var materialIncludes = material.shaderIncludes; //custom chunks var vertexShader = shader.vertexShader; @@ -509,7 +506,7 @@ function WebGLProgram( renderer, extensions, code, material, shader, parameters } - //4. provide optional chunk dictionary + //3. provide optional chunk dictionary customIncludes vertexShader = parseIncludes( vertexShader, customIncludes ); vertexShader = replaceLightNums( vertexShader, parameters ); diff --git a/src/renderers/webgl/WebGLPrograms.js b/src/renderers/webgl/WebGLPrograms.js index c2bb548ba32522..3456cbe0364642 100644 --- a/src/renderers/webgl/WebGLPrograms.js +++ b/src/renderers/webgl/WebGLPrograms.js @@ -241,12 +241,12 @@ function WebGLPrograms( renderer, extensions, capabilities ) { } - //5. if the user is aware of the feature and added a dictionary - if ( material.shaderIncludes !== undefined ){ + //4. if the user is aware of the feature and added a dictionary + if ( material.shaderIncludes !== undefined ) { - for ( var include in material.shaderIncludes ){ + for ( var include in material.shaderIncludes ) { - //5. do proper hashing, onBeforeCompile.toString() had some issues + //4. hash with chunks? array.push( material.shaderIncludes[ include ] ); } From f66ce12654b4b9c3b0db09dba996a7d75fbac870 Mon Sep 17 00:00:00 2001 From: Dusan Bosnjak Date: Mon, 29 Jan 2018 19:55:50 -0800 Subject: [PATCH 17/17] killed too much of uniforms --- src/renderers/WebGLRenderer.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index f00de74ad1d30a..3f1cfe04876d9f 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -1500,9 +1500,13 @@ function WebGLRenderer( parameters ) { var shader = ShaderLib[ parameters.shaderID ]; + var computedUniforms = undefined !== material.shaderUniforms ? + UniformsUtils.merge([ UniformsUtils.clone( shader.uniforms ), material.shaderUniforms ]) : + UniformsUtils.clone( shader.uniforms ); + materialProperties.shader = { name: material.type, - uniforms: UniformsUtils.clone( shader.uniforms ), + uniforms: computedUniforms, vertexShader: shader.vertexShader, fragmentShader: shader.fragmentShader };