Skip to content

Commit

Permalink
Merge pull request #19673 from Mugen87/dev51
Browse files Browse the repository at this point in the history
WebGLPrograms: Improve performance of getParameters().
  • Loading branch information
mrdoob authored Jul 13, 2020
2 parents d09193d + 941beb6 commit 2f70cd4
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 39 deletions.
5 changes: 2 additions & 3 deletions src/materials/Material.d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { Plane } from './../math/Plane';
import { Shader } from './../renderers/shaders/ShaderLib';
import { EventDispatcher } from './../core/EventDispatcher';
import { WebGLRenderer } from './../renderers/WebGLRenderer';
import {
Expand Down Expand Up @@ -322,10 +321,10 @@ export class Material extends EventDispatcher {

/**
* An optional callback that is executed immediately before the shader program is compiled. This function is called with the shader source code as a parameter. Useful for the modification of built-in materials.
* @param shader Source code of the shader
* @param shaderobject Represents the shader source code and program information.
* @param renderer WebGLRenderer Context that is initializing the material
*/
onBeforeCompile ( shader : Shader, renderer : WebGLRenderer ) : void;
onBeforeCompile ( shaderobject : object, renderer : WebGLRenderer ) : void;

/**
* In case onBeforeCompile is used, this callback can be used to identify values of settings used in onBeforeCompile, so three.js can reuse a cached shader or recompile the shader as needed.
Expand Down
4 changes: 4 additions & 0 deletions src/renderers/WebGLRenderer.js
Original file line number Diff line number Diff line change
Expand Up @@ -1350,6 +1350,10 @@ function WebGLRenderer( parameters ) {

if ( programChange ) {

parameters.uniforms = programCache.getUniforms( material, parameters );

material.onBeforeCompile( parameters, _this );

program = programCache.acquireProgram( parameters, programCacheKey );

materialProperties.program = program;
Expand Down
1 change: 1 addition & 0 deletions src/renderers/webgl/WebGLPrograms.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ export class WebGLPrograms {
object: any
): any;
getProgramCacheKey( parameters: any ): string;
getUniforms( material: Material ): object;
acquireProgram(
parameters: any,
cacheKey: string
Expand Down
75 changes: 39 additions & 36 deletions src/renderers/webgl/WebGLPrograms.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,36 +53,6 @@ function WebGLPrograms( renderer, extensions, capabilities, bindingStates ) {
"sheen"
];

function getShaderObject( material, shaderID ) {

let shaderobject;

if ( shaderID ) {

const shader = ShaderLib[ shaderID ];

shaderobject = {
name: material.name || material.type,
uniforms: UniformsUtils.clone( shader.uniforms ),
vertexShader: shader.vertexShader,
fragmentShader: shader.fragmentShader
};

} else {

shaderobject = {
name: material.name || material.type,
uniforms: material.uniforms,
vertexShader: material.vertexShader,
fragmentShader: material.fragmentShader
};

}

return shaderobject;

}

function allocateBones( object ) {

const skeleton = object.skeleton;
Expand Down Expand Up @@ -168,8 +138,21 @@ function WebGLPrograms( renderer, extensions, capabilities, bindingStates ) {

}

const shaderobject = getShaderObject( material, shaderID );
material.onBeforeCompile( shaderobject, renderer );
let vertexShader, fragmentShader;

if ( shaderID ) {

const shader = ShaderLib[ shaderID ];

vertexShader = shader.vertexShader;
fragmentShader = shader.fragmentShader;

} else {

vertexShader = material.vertexShader;
fragmentShader = material.fragmentShader;

}

const currentRenderTarget = renderer.getRenderTarget();

Expand All @@ -178,11 +161,10 @@ function WebGLPrograms( renderer, extensions, capabilities, bindingStates ) {
isWebGL2: isWebGL2,

shaderID: shaderID,
shaderName: shaderobject.name,
shaderName: material.name || material.type,

uniforms: shaderobject.uniforms,
vertexShader: shaderobject.vertexShader,
fragmentShader: shaderobject.fragmentShader,
vertexShader: vertexShader,
fragmentShader: fragmentShader,
defines: material.defines,

isRawShaderMaterial: material.isRawShaderMaterial,
Expand Down Expand Up @@ -342,6 +324,26 @@ function WebGLPrograms( renderer, extensions, capabilities, bindingStates ) {

}

function getUniforms( material ) {

const shaderID = shaderIDs[ material.type ];
let uniforms;

if ( shaderID ) {

const shader = ShaderLib[ shaderID ];
uniforms = UniformsUtils.clone( shader.uniforms );

} else {

uniforms = material.uniforms;

}

return uniforms;

}

function acquireProgram( parameters, cacheKey ) {

let program;
Expand Down Expand Up @@ -392,6 +394,7 @@ function WebGLPrograms( renderer, extensions, capabilities, bindingStates ) {
return {
getParameters: getParameters,
getProgramCacheKey: getProgramCacheKey,
getUniforms: getUniforms,
acquireProgram: acquireProgram,
releaseProgram: releaseProgram,
// Exposed for resource monitoring & error feedback via renderer.info:
Expand Down

0 comments on commit 2f70cd4

Please sign in to comment.