Skip to content

Commit e1dc982

Browse files
committed
WebGLRenderer: Use single parameter object for program acquisition.
1 parent 548554d commit e1dc982

File tree

3 files changed

+95
-72
lines changed

3 files changed

+95
-72
lines changed

src/renderers/WebGLRenderer.js

Lines changed: 6 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@ import { _Math } from '../math/Math.js';
1919
import { DataTexture } from '../textures/DataTexture.js';
2020
import { Frustum } from '../math/Frustum.js';
2121
import { Matrix4 } from '../math/Matrix4.js';
22-
import { ShaderLib } from './shaders/ShaderLib.js';
2322
import { UniformsLib } from './shaders/UniformsLib.js';
24-
import { cloneUniforms } from './shaders/UniformsUtils.js';
2523
import { Vector2 } from '../math/Vector2.js';
2624
import { Vector3 } from '../math/Vector3.js';
2725
import { Vector4 } from '../math/Vector4.js';
@@ -1498,10 +1496,8 @@ function WebGLRenderer( parameters ) {
14981496

14991497
var lightsStateVersion = lights.state.version;
15001498

1501-
var parameters = programCache.getParameters(
1502-
material, lights.state, shadowsArray, scene, _clipping.numPlanes, _clipping.numIntersection, object );
1503-
1504-
var programCacheKey = programCache.getProgramCacheKey( material, parameters );
1499+
var parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, _clipping.numPlanes, _clipping.numIntersection, object );
1500+
var programCacheKey = programCache.getProgramCacheKey( parameters );
15051501

15061502
var program = materialProperties.program;
15071503
var programChange = true;
@@ -1536,36 +1532,10 @@ function WebGLRenderer( parameters ) {
15361532

15371533
if ( programChange ) {
15381534

1539-
if ( parameters.shaderID ) {
1540-
1541-
var shader = ShaderLib[ parameters.shaderID ];
1542-
1543-
materialProperties.shader = {
1544-
name: material.type,
1545-
uniforms: cloneUniforms( shader.uniforms ),
1546-
vertexShader: shader.vertexShader,
1547-
fragmentShader: shader.fragmentShader
1548-
};
1549-
1550-
} else {
1551-
1552-
materialProperties.shader = {
1553-
name: material.type,
1554-
uniforms: material.uniforms,
1555-
vertexShader: material.vertexShader,
1556-
fragmentShader: material.fragmentShader
1557-
};
1558-
1559-
}
1560-
1561-
material.onBeforeCompile( materialProperties.shader, _this );
1562-
1563-
// Computing cache key again as onBeforeCompile may have changed the shaders
1564-
programCacheKey = programCache.getProgramCacheKey( material, parameters );
1565-
1566-
program = programCache.acquireProgram( material, materialProperties.shader, parameters, programCacheKey );
1535+
program = programCache.acquireProgram( parameters, programCacheKey );
15671536

15681537
materialProperties.program = program;
1538+
materialProperties.uniforms = parameters.uniforms;
15691539
materialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;
15701540
materialProperties.outputEncoding = _this.outputEncoding;
15711541
material.program = program;
@@ -1606,7 +1576,7 @@ function WebGLRenderer( parameters ) {
16061576

16071577
}
16081578

1609-
var uniforms = materialProperties.shader.uniforms;
1579+
var uniforms = materialProperties.uniforms;
16101580

16111581
if ( ! material.isShaderMaterial &&
16121582
! material.isRawShaderMaterial ||
@@ -1729,7 +1699,7 @@ function WebGLRenderer( parameters ) {
17291699

17301700
var program = materialProperties.program,
17311701
p_uniforms = program.getUniforms(),
1732-
m_uniforms = materialProperties.shader.uniforms;
1702+
m_uniforms = materialProperties.uniforms;
17331703

17341704
if ( state.useProgram( program.program ) ) {
17351705

src/renderers/webgl/WebGLProgram.js

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -115,15 +115,13 @@ function getToneMappingFunction( functionName, toneMapping ) {
115115

116116
}
117117

118-
function generateExtensions( extensions, parameters, rendererExtensions ) {
119-
120-
extensions = extensions || {};
118+
function generateExtensions( parameters ) {
121119

122120
var chunks = [
123-
( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.tangentSpaceNormalMap || parameters.clearcoatNormalMap || parameters.flatShading || parameters.shaderID === 'physical' ) ? '#extension GL_OES_standard_derivatives : enable' : '',
124-
( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',
125-
( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',
126-
( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : ''
121+
( parameters.extensionDerivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.tangentSpaceNormalMap || parameters.clearcoatNormalMap || parameters.flatShading || parameters.shaderID === 'physical' ) ? '#extension GL_OES_standard_derivatives : enable' : '',
122+
( parameters.extensionFragDepth || parameters.logarithmicDepthBuffer ) && parameters.rendererExtensionFragDepth ? '#extension GL_EXT_frag_depth : enable' : '',
123+
( parameters.extensionDrawBuffers && parameters.rendererExtensionDrawBuffers ) ? '#extension GL_EXT_draw_buffers : require' : '',
124+
( parameters.extensionShaderTextureLOD || parameters.envMap ) && parameters.rendererExtensionShaderTextureLod ? '#extension GL_EXT_shader_texture_lod : enable' : ''
127125
];
128126

129127
return chunks.filter( filterEmptyLine ).join( '\n' );
@@ -377,14 +375,14 @@ function generateEnvMapBlendingDefine( parameters ) {
377375

378376
}
379377

380-
function WebGLProgram( renderer, extensions, cacheKey, material, shader, parameters ) {
378+
function WebGLProgram( renderer, cacheKey, parameters ) {
381379

382380
var gl = renderer.getContext();
383381

384-
var defines = material.defines;
382+
var defines = parameters.defines;
385383

386-
var vertexShader = shader.vertexShader;
387-
var fragmentShader = shader.fragmentShader;
384+
var vertexShader = parameters.vertexShader;
385+
var fragmentShader = parameters.fragmentShader;
388386
var shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );
389387
var envMapTypeDefine = generateEnvMapTypeDefine( parameters );
390388
var envMapModeDefine = generateEnvMapModeDefine( parameters );
@@ -393,7 +391,7 @@ function WebGLProgram( renderer, extensions, cacheKey, material, shader, paramet
393391

394392
var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;
395393

396-
var customExtensions = parameters.isWebGL2 ? '' : generateExtensions( material.extensions, parameters, extensions );
394+
var customExtensions = parameters.isWebGL2 ? '' : generateExtensions( parameters );
397395

398396
var customDefines = generateDefines( defines );
399397

@@ -403,7 +401,7 @@ function WebGLProgram( renderer, extensions, cacheKey, material, shader, paramet
403401

404402
var numMultiviewViews = parameters.numMultiviewViews;
405403

406-
if ( material.isRawShaderMaterial ) {
404+
if ( parameters.isRawShaderMaterial ) {
407405

408406
prefixVertex = [
409407

@@ -436,7 +434,7 @@ function WebGLProgram( renderer, extensions, cacheKey, material, shader, paramet
436434

437435
generatePrecision( parameters ),
438436

439-
'#define SHADER_NAME ' + shader.name,
437+
'#define SHADER_NAME ' + parameters.shaderName,
440438

441439
customDefines,
442440

@@ -488,7 +486,7 @@ function WebGLProgram( renderer, extensions, cacheKey, material, shader, paramet
488486
parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',
489487

490488
parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
491-
parameters.logarithmicDepthBuffer && ( parameters.isWebGL2 || extensions.get( 'EXT_frag_depth' ) ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
489+
parameters.logarithmicDepthBuffer && ( parameters.isWebGL2 || parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
492490

493491
'uniform mat4 modelMatrix;',
494492
'uniform mat4 modelViewMatrix;',
@@ -562,7 +560,7 @@ function WebGLProgram( renderer, extensions, cacheKey, material, shader, paramet
562560

563561
generatePrecision( parameters ),
564562

565-
'#define SHADER_NAME ' + shader.name,
563+
'#define SHADER_NAME ' + parameters.name,
566564

567565
customDefines,
568566

@@ -614,9 +612,9 @@ function WebGLProgram( renderer, extensions, cacheKey, material, shader, paramet
614612
parameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '',
615613

616614
parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
617-
parameters.logarithmicDepthBuffer && ( parameters.isWebGL2 || extensions.get( 'EXT_frag_depth' ) ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
615+
parameters.logarithmicDepthBuffer && ( parameters.isWebGL2 || parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
618616

619-
( ( material.extensions ? material.extensions.shaderTextureLOD : false ) || parameters.envMap ) && ( parameters.isWebGL2 || extensions.get( 'EXT_shader_texture_lod' ) ) ? '#define TEXTURE_LOD_EXT' : '',
617+
( parameters.extensionShaderTextureLOD || parameters.envMap ) && ( parameters.isWebGL2 || parameters.rendererExtensionShaderTextureLod ) ? '#define TEXTURE_LOD_EXT' : '',
620618

621619
'uniform mat4 viewMatrix;',
622620
'uniform vec3 cameraPosition;',
@@ -637,7 +635,7 @@ function WebGLProgram( renderer, extensions, cacheKey, material, shader, paramet
637635
parameters.lightMapEncoding ? getTexelDecodingFunction( 'lightMapTexelToLinear', parameters.lightMapEncoding ) : '',
638636
parameters.outputEncoding ? getTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ) : '',
639637

640-
parameters.depthPacking ? '#define DEPTH_PACKING ' + material.depthPacking : '',
638+
parameters.depthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '',
641639

642640
'\n'
643641

@@ -656,13 +654,13 @@ function WebGLProgram( renderer, extensions, cacheKey, material, shader, paramet
656654
vertexShader = unrollLoops( vertexShader );
657655
fragmentShader = unrollLoops( fragmentShader );
658656

659-
if ( parameters.isWebGL2 && ! material.isRawShaderMaterial ) {
657+
if ( parameters.isWebGL2 && ! parameters.isRawShaderMaterial ) {
660658

661659
var isGLSL3ShaderMaterial = false;
662660

663661
var versionRegex = /^\s*#version\s+300\s+es\s*\n/;
664662

665-
if ( material.isShaderMaterial &&
663+
if ( parameters.isShaderMaterial &&
666664
vertexShader.match( versionRegex ) !== null &&
667665
fragmentShader.match( versionRegex ) !== null ) {
668666

@@ -768,9 +766,9 @@ function WebGLProgram( renderer, extensions, cacheKey, material, shader, paramet
768766

769767
// Force a particular attribute to index 0.
770768

771-
if ( material.index0AttributeName !== undefined ) {
769+
if ( parameters.index0AttributeName !== undefined ) {
772770

773-
gl.bindAttribLocation( program, 0, material.index0AttributeName );
771+
gl.bindAttribLocation( program, 0, parameters.index0AttributeName );
774772

775773
} else if ( parameters.morphTargets === true ) {
776774

@@ -815,7 +813,6 @@ function WebGLProgram( renderer, extensions, cacheKey, material, shader, paramet
815813
this.diagnostics = {
816814

817815
runnable: runnable,
818-
material: material,
819816

820817
programLog: programLog,
821818

@@ -887,7 +884,7 @@ function WebGLProgram( renderer, extensions, cacheKey, material, shader, paramet
887884

888885
//
889886

890-
this.name = shader.name;
887+
this.name = parameters.shaderName;
891888
this.id = programIdCount ++;
892889
this.cacheKey = cacheKey;
893890
this.usedTimes = 1;

src/renderers/webgl/WebGLPrograms.js

Lines changed: 67 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
import { BackSide, DoubleSide, CubeUVRefractionMapping, CubeUVReflectionMapping, LinearEncoding, ObjectSpaceNormalMap, TangentSpaceNormalMap, NoToneMapping } from '../../constants.js';
66
import { WebGLProgram } from './WebGLProgram.js';
7+
import { ShaderLib } from '../shaders/ShaderLib.js';
8+
import { UniformsUtils } from '../shaders/UniformsUtils.js';
79

810
function WebGLPrograms( renderer, extensions, capabilities ) {
911

@@ -50,6 +52,35 @@ function WebGLPrograms( renderer, extensions, capabilities ) {
5052
"sheen"
5153
];
5254

55+
function getShaderObject( material, shaderID ) {
56+
57+
var shaderobject;
58+
59+
if ( shaderID ) {
60+
61+
var shader = ShaderLib[ shaderID ];
62+
63+
shaderobject = {
64+
name: material.type,
65+
uniforms: UniformsUtils.clone( shader.uniforms ),
66+
vertexShader: shader.vertexShader,
67+
fragmentShader: shader.fragmentShader
68+
};
69+
70+
} else {
71+
72+
shaderobject = {
73+
name: material.type,
74+
uniforms: material.uniforms,
75+
vertexShader: material.vertexShader,
76+
fragmentShader: material.fragmentShader
77+
};
78+
79+
}
80+
81+
return shaderobject;
82+
83+
}
5384

5485
function allocateBones( object ) {
5586

@@ -136,6 +167,9 @@ function WebGLPrograms( renderer, extensions, capabilities ) {
136167

137168
}
138169

170+
var shaderobject = getShaderObject( material, shaderID );
171+
material.onBeforeCompile( shaderobject, renderer );
172+
139173
var currentRenderTarget = renderer.getRenderTarget();
140174
var numMultiviewViews = currentRenderTarget && currentRenderTarget.isWebGLMultiviewRenderTarget ? currentRenderTarget.numViews : 0;
141175

@@ -144,6 +178,15 @@ function WebGLPrograms( renderer, extensions, capabilities ) {
144178
isWebGL2: isWebGL2,
145179

146180
shaderID: shaderID,
181+
shaderName: shaderobject.name,
182+
183+
uniforms: shaderobject.uniforms,
184+
vertexShader: shaderobject.vertexShader,
185+
fragmentShader: shaderobject.fragmentShader,
186+
defines: material.defines,
187+
188+
isRawShaderMaterial: material.isRawShaderMaterial,
189+
isShaderMaterial: material.isShaderMaterial,
147190

148191
precision: precision,
149192

@@ -232,15 +275,28 @@ function WebGLPrograms( renderer, extensions, capabilities ) {
232275
doubleSided: material.side === DoubleSide,
233276
flipSided: material.side === BackSide,
234277

235-
depthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false
278+
depthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false,
279+
280+
index0AttributeName: material.index0AttributeName,
281+
282+
extensionDerivatives: material.extensions && material.extensions.derivatives,
283+
extensionFragDepth: material.extensions && material.extensions.frawbuffers,
284+
extensionDrawbuffers: material.extensions && material.extensions.drawbuffers,
285+
extensionShaderTextureLOD: material.extensions && material.extensions.shaderTextureLOD,
286+
287+
renderExtensionFragDepth: extensions.get( 'EXT_frag_depth' ) !== undefined,
288+
renderExtensionDrawBuffers: extensions.get( 'WEBGL_draw_buffers' ) !== undefined,
289+
renderExtensionShaderTextureLod: extensions.get( 'EXT_shader_texture_lod' ) !== undefined,
290+
291+
onBeforeCompile: material.onBeforeCompile
236292

237293
};
238294

239295
return parameters;
240296

241297
};
242298

243-
this.getProgramCacheKey = function ( material, parameters ) {
299+
this.getProgramCacheKey = function ( parameters ) {
244300

245301
var array = [];
246302

@@ -250,23 +306,23 @@ function WebGLPrograms( renderer, extensions, capabilities ) {
250306

251307
} else {
252308

253-
array.push( material.fragmentShader );
254-
array.push( material.vertexShader );
309+
array.push( parameters.fragmentShader );
310+
array.push( parameters.vertexShader );
255311

256312
}
257313

258-
if ( material.defines !== undefined ) {
314+
if ( parameters.defines !== undefined ) {
259315

260-
for ( var name in material.defines ) {
316+
for ( var name in parameters.defines ) {
261317

262318
array.push( name );
263-
array.push( material.defines[ name ] );
319+
array.push( parameters.defines[ name ] );
264320

265321
}
266322

267323
}
268324

269-
if ( material.isRawShaderMaterial === undefined ) {
325+
if ( parameters.isRawShaderMaterial === undefined ) {
270326

271327
for ( var i = 0; i < parameterNames.length; i ++ ) {
272328

@@ -279,13 +335,13 @@ function WebGLPrograms( renderer, extensions, capabilities ) {
279335

280336
}
281337

282-
array.push( material.onBeforeCompile.toString() );
338+
array.push( parameters.onBeforeCompile.toString() );
283339

284340
return array.join();
285341

286342
};
287343

288-
this.acquireProgram = function ( material, shader, parameters, cacheKey ) {
344+
this.acquireProgram = function ( parameters, cacheKey ) {
289345

290346
var program;
291347

@@ -307,7 +363,7 @@ function WebGLPrograms( renderer, extensions, capabilities ) {
307363

308364
if ( program === undefined ) {
309365

310-
program = new WebGLProgram( renderer, extensions, cacheKey, material, shader, parameters );
366+
program = new WebGLProgram( renderer, cacheKey, parameters );
311367
programs.push( program );
312368

313369
}

0 commit comments

Comments
 (0)