Skip to content

Commit

Permalink
Merge pull request #17190 from sunag/dev-nodes-irradiance
Browse files Browse the repository at this point in the history
NodeMaterial: Bias example
  • Loading branch information
mrdoob authored Aug 8, 2019
2 parents ec596c6 + 4efaf9c commit 1bda529
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 62 deletions.
11 changes: 9 additions & 2 deletions examples/jsm/nodes/core/FunctionNode.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ var declarationRegexp = /^([a-z_0-9]+)\s([a-z_0-9]+)\s*\((.*?)\)/i,
function FunctionNode( src, includes, extensions, keywords, type ) {

this.isMethod = type === undefined;
this.isInterface = false;

TempNode.call( this, type );

Expand Down Expand Up @@ -139,7 +140,11 @@ FunctionNode.prototype.generate = function ( builder, output ) {

} else if ( this.isMethod ) {

builder.include( this, false, src );
if ( ! this.isInterface ) {

builder.include( this, false, src );

}

return this.name;

Expand Down Expand Up @@ -181,7 +186,7 @@ FunctionNode.prototype.parse = function ( src, includes, extensions, keywords )
var qualifier = inputs[ i ++ ];
var type, name;

if ( qualifier == 'in' || qualifier == 'out' || qualifier == 'inout' ) {
if ( qualifier === 'in' || qualifier === 'out' || qualifier === 'inout' ) {

type = inputs[ i ++ ];

Expand All @@ -204,6 +209,8 @@ FunctionNode.prototype.parse = function ( src, includes, extensions, keywords )

}

this.isInterface = this.src.indexOf('{') === -1;

} else {

this.type = '';
Expand Down
2 changes: 0 additions & 2 deletions examples/jsm/nodes/materials/nodes/StandardNode.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,6 @@ StandardNode.prototype.build = function ( builder ) {

builder.define( this.clearCoat || this.clearCoatRoughness ? 'PHYSICAL' : 'STANDARD' );

if ( this.energyPreservation ) builder.define( 'ENERGY_PRESERVATION' );

builder.requires.lights = true;

builder.extensions.shaderTextureLOD = true;
Expand Down
8 changes: 5 additions & 3 deletions examples/jsm/nodes/misc/TextureCubeNode.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,19 @@ import { NormalNode } from '../accessors/NormalNode.js';
import { ColorSpaceNode } from '../utils/ColorSpaceNode.js';
import { BlinnExponentToRoughnessNode } from '../bsdfs/BlinnExponentToRoughnessNode.js';

function TextureCubeNode( value, textureSize ) {
function TextureCubeNode( value, textureSize, uv, bias ) {

TempNode.call( this, 'v4' );

this.value = value;
this.textureSize = textureSize || new FloatNode( 1024 );
this.uv = uv || new ReflectNode( ReflectNode.VECTOR );
this.bias = bias || new BlinnExponentToRoughnessNode();

this.radianceCache = { uv: new TextureCubeUVNode(
new ReflectNode( ReflectNode.VECTOR ),
this.uv,
this.textureSize,
new BlinnExponentToRoughnessNode()
this.bias
) };

this.irradianceCache = { uv: new TextureCubeUVNode(
Expand Down
160 changes: 105 additions & 55 deletions examples/webgl_materials_nodes.html
Original file line number Diff line number Diff line change
Expand Up @@ -71,63 +71,56 @@

}

var cubemap = function () {
var premTexture, pmremCube, pmremGenerator, pmremCubeUVPacker, premSize = 1024;

var path = "textures/cube/Park2/";
var format = '.jpg';
var urls = [
path + 'posx' + format, path + 'negx' + format,
path + 'posy' + format, path + 'negy' + format,
path + 'posz' + format, path + 'negz' + format
];
function updatePREM( textureCube ) {

var textureCube = new THREE.CubeTextureLoader().load( urls );
textureCube.format = THREE.RGBFormat;
pmremCube = pmremCube || textureCube;

library[ textureCube.uuid ] = textureCube;
if ( ! pmremCube || ! renderer ) return;

return textureCube;
var minFilter = pmremCube.minFilter;
var magFilter = pmremCube.magFilter;
var generateMipmaps = pmremCube.generateMipmaps;

}();
pmremGenerator = new PMREMGenerator( pmremCube, undefined, premSize / 4 );
pmremGenerator.update( renderer );

function generatePREM( cubeMap, textureSize ) {
pmremCubeUVPacker = new PMREMCubeUVPacker( pmremGenerator.cubeLods );
pmremCubeUVPacker.update( renderer );

textureSize = textureSize || 1024;
pmremCube.minFilter = minFilter;
pmremCube.magFilter = magFilter;
pmremCube.generateMipmaps = pmremCube.generateMipmaps;
pmremCube.needsUpdate = true;

var pmremGenerator = new PMREMGenerator( cubeMap, undefined, textureSize / 4 );
pmremGenerator.update( renderer );
premTexture = pmremCubeUVPacker.CubeUVRenderTarget.texture

var pmremCubeUVPacker = new PMREMCubeUVPacker( pmremGenerator.cubeLods );
pmremCubeUVPacker.update( renderer );
library[ premTexture.uuid ] = premTexture;

pmremGenerator.dispose();
pmremCubeUVPacker.dispose();

return pmremCubeUVPacker.CubeUVRenderTarget.texture;

}

var premTexture;

function getPREM( callback, textureSize ) {

if ( premTexture ) return callback( premTexture );

var hdrUrls = [ 'px.hdr', 'nx.hdr', 'py.hdr', 'ny.hdr', 'pz.hdr', 'nz.hdr' ];
var hdrCubeMap = new HDRCubeTextureLoader()
.setPath( './textures/cube/pisaHDR/' )
.setDataType( THREE.UnsignedByteType )
.load( hdrUrls, function () {
var cubemap = function () {

premTexture = generatePREM( hdrCubeMap, textureSize );
var path = "textures/cube/Park2/";
var format = '.jpg';
var urls = [
path + 'posx' + format, path + 'negx' + format,
path + 'posy' + format, path + 'negy' + format,
path + 'posz' + format, path + 'negz' + format
];

library[ premTexture.uuid ] = premTexture;
var textureCube = new THREE.CubeTextureLoader().load( urls, updatePREM );
textureCube.format = THREE.RGBFormat;

callback( premTexture );
library[ textureCube.uuid ] = textureCube;

} );
return textureCube;

}
}();

window.addEventListener( 'load', init );

Expand Down Expand Up @@ -176,6 +169,8 @@
library[ camera.uuid ] = camera;
library[ mesh.uuid ] = mesh;

updatePREM();

window.addEventListener( 'resize', onWindowResize, false );

updateMaterial();
Expand Down Expand Up @@ -226,6 +221,7 @@
'adv / expression': 'expression',
'adv / sss': 'sss',
'adv / translucent': 'translucent',
'adv / bias': 'bias',
'node / position': 'node-position',
'node / normal': 'node-normal',
'node / reflect': 'node-reflect',
Expand Down Expand Up @@ -504,14 +500,8 @@
mtl.normal = new Nodes.NormalMapNode( new Nodes.TextureNode( getTexture( "grassNormal" ) ) );
mtl.normal.scale = normalMask;

getPREM(function(texture) {

var envNode = new Nodes.TextureCubeNode( new Nodes.TextureNode( texture ) );

mtl.environment = new Nodes.OperatorNode( envNode, intensity, Nodes.OperatorNode.MUL );
mtl.needsUpdate = true;

});
var envNode = new Nodes.TextureCubeNode( new Nodes.TextureNode( premTexture ) );
mtl.environment = new Nodes.OperatorNode( envNode, intensity, Nodes.OperatorNode.MUL );

// GUI

Expand Down Expand Up @@ -587,18 +577,13 @@
mtl.normal = new Nodes.NormalMapNode( new Nodes.TextureNode( getTexture( "grassNormal" ) ) );
mtl.normal.scale = normalScale;

getPREM(function(texture) {

var envNode = new Nodes.TextureCubeNode( new Nodes.TextureNode( texture ) );
var envNode = new Nodes.TextureCubeNode( new Nodes.TextureNode( premTexture ) );

var subSlotNode = new Nodes.SubSlotNode();
subSlotNode.slots['radiance'] = new Nodes.OperatorNode( radiance, envNode, Nodes.OperatorNode.MUL );
subSlotNode.slots['irradiance'] = new Nodes.OperatorNode( irradiance, envNode, Nodes.OperatorNode.MUL );
var subSlotNode = new Nodes.SubSlotNode();
subSlotNode.slots['radiance'] = new Nodes.OperatorNode( radiance, envNode, Nodes.OperatorNode.MUL );
subSlotNode.slots['irradiance'] = new Nodes.OperatorNode( irradiance, envNode, Nodes.OperatorNode.MUL );

mtl.environment = subSlotNode;
mtl.needsUpdate = true;

});
mtl.environment = subSlotNode

// GUI

Expand Down Expand Up @@ -2483,6 +2468,71 @@

break;

case 'bias':

// PREREQUISITES

var image = cubemap.image[ 0 ];
var maxMIPLevel = image !== undefined ? Math.log( Math.max( image.width, image.height ) ) * Math.LOG2E : 0;

// MATERIAL

var bias = new Nodes.FloatNode( .5 );
var mipsBias = new Nodes.OperatorNode( bias, new Nodes.FloatNode( maxMIPLevel ), Nodes.OperatorNode.MUL );

mtl = new Nodes.PhongNodeMaterial();
mtl.color.value.setHex( 0xFFFFFF );

function biasMode( val ) {

switch( val ) {

case 'prem':

mtl.color = new Nodes.TextureCubeNode( new Nodes.TextureNode( premTexture ), undefined, undefined, bias );

break;

case 'lod':

var textureCubeFunction = new Nodes.FunctionNode( 'vec4 textureCubeLodEXT( samplerCube texture, vec3 uv, float bias );', undefined, { shaderTextureLOD: true } );

mtl.color = new Nodes.FunctionCallNode( textureCubeFunction, [ new Nodes.CubeTextureNode( cubemap ), new Nodes.ReflectNode(), mipsBias ] );

break;

case 'basic':

var textureCubeFunction = new Nodes.FunctionNode( 'vec4 textureCube( samplerCube texture, vec3 uv, float bias );' );

mtl.color = new Nodes.FunctionCallNode( textureCubeFunction, [ new Nodes.CubeTextureNode( cubemap ), new Nodes.ReflectNode(), mipsBias ] );

break;

}

mtl.needsUpdate = true;

}

biasMode( 'prem' );

// GUI

addGui( 'scope', {
PREM: 'prem',
LOD: 'lod',
BASIC: 'basic'
}, biasMode );

addGui( 'bias', bias.value, function ( val ) {

bias.value = val;

}, false, 0, 1 );

break;

case 'node-position':

// MATERIAL
Expand Down

0 comments on commit 1bda529

Please sign in to comment.