Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
250 changes: 250 additions & 0 deletions examples/webgl_materials_variations_physical2.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,250 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>three.js webgl - materials</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<style>
body {
color: #fff;
font-family:Monospace;
font-size:13px;
text-align:center;

background-color: #fff;
margin: 0px;
overflow: hidden;
}

#info {
position: absolute;
top: 0px; width: 100%;
padding: 5px;
}
</style>
</head>
<body>

<div id="container"></div>
<div id="info"><a href="http://threejs.org" target="_blank">three.js</a> - Physical Material Variantions v2 by <a href="http://clara.io/" target="_blank">Ben Houston</a>.</div>

<script src="../build/three.min.js"></script>
<script src="js/controls/OrbitControls.js"></script>
<script src="js/geometries/TextGeometry.js"></script>
<script src="js/utils/FontUtils.js"></script>
<script src="fonts/gentilis_regular.typeface.js"></script>

<script src="js/Detector.js"></script>
<script src="js/libs/stats.min.js"></script>

<script>

if ( ! Detector.webgl ) Detector.addGetWebGLMessage();

var container, stats;

var camera, scene, renderer, controls, objects = [];
var particleLight;

init();
animate();

function init() {

container = document.createElement( 'div' );
document.body.appendChild( container );

camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 1, 2000 );
camera.position.set( 0.0, 400, 400 * 3.5 );

scene = new THREE.Scene();

// Materials

var imgTexture = THREE.ImageUtils.loadTexture( "textures/planets/moon_1024.jpg" );
imgTexture.wrapS = imgTexture.wrapT = THREE.RepeatWrapping;
imgTexture.anisotropy = 16;
imgTexture = null;

var shininess = 50, specular = 0x333333, bumpScale = 1, shading = THREE.SmoothShading;

var materials = [];

var path = "textures/cube/SwedishRoyalCastle/";
var format = '.jpg';
var urls = [
path + 'px' + format, path + 'nx' + format,
path + 'py' + format, path + 'ny' + format,
path + 'pz' + format, path + 'nz' + format
];

var reflectionCube = THREE.ImageUtils.loadTextureCube( urls );
reflectionCube.format = THREE.RGBFormat;

var cubeWidth = 400;
var numberOfSphersPerSide = 5;
var sphereRadius = ( cubeWidth / numberOfSphersPerSide ) * 0.8 * 0.5;
var stepSize = 1.0 / numberOfSphersPerSide;

var geometry = new THREE.SphereBufferGeometry( sphereRadius, 32, 16 );

var localReflectionCube;

for( var alpha = 0, alphaIndex = 0; alpha <= 1.0; alpha += stepSize, alphaIndex ++ ) {

var roughness = 1.0 - alpha;

if( alphaIndex % 2 === 0 ) {
localReflectionCube = null;
}
else {
localReflectionCube = reflectionCube;
}

for( var beta = 0; beta <= 1.0; beta += stepSize ) {

var reflectivity = beta;

for( var gamma = 0; gamma <= 1.0; gamma += stepSize ) {

// basic monochromatic energy preservation
var diffuseColor = new THREE.Color( gamma, 0, 0 ).multiplyScalar( 1 - 0.08 );

var material = new THREE.MeshPhysicalMaterial( { map: imgTexture, bumpMap: imgTexture, bumpScale: bumpScale, color: diffuseColor, reflectivity: reflectivity, roughness: roughness, shading: THREE.SmoothShading, envMap: localReflectionCube } )

var mesh = new THREE.Mesh( geometry, material );

mesh.position.x = alpha * 400 - 200;
mesh.position.y = beta * 400 - 200;
mesh.position.z = gamma * 400 - 200;

objects.push( mesh );

scene.add( mesh );
}
}
}

function addLabel( name, location ) {
var textGeo = new THREE.TextGeometry( name, {

size: 20,
height: 5,
curveSegments: 10,

font: 'gentilis',
weight: 'normal',
style: 'normal',

material: 0,
extrudeMaterial: 1

});

var textMaterial = new THREE.MeshBasicMaterial( { color: 0xffffff } );
var textMesh = new THREE.Mesh( textGeo, textMaterial );
textMesh.position.copy( location );
scene.add( textMesh );
}

addLabel( "+roughness", new THREE.Vector3( -350, 0, 0 ) );
addLabel( "-roughness", new THREE.Vector3( 350, 0, 0 ) );

addLabel( "-reflectivity", new THREE.Vector3( 0, -300, 0 ) );
addLabel( "+reflectivity", new THREE.Vector3( 0, 300, 0 ) );

addLabel( "-diffuse", new THREE.Vector3( 0, 0, -300 ) );
addLabel( "+diffuse", new THREE.Vector3( 0, 0, 300 ) );

particleLight = new THREE.Mesh( new THREE.SphereBufferGeometry( 4, 8, 8 ), new THREE.MeshBasicMaterial( { color: 0xffffff } ) );
scene.add( particleLight );

// Lights

scene.add( new THREE.AmbientLight( 0x222222 ) );

var directionalLight = new THREE.DirectionalLight( 0xffffff, 1 );
directionalLight.position.set( 1, 1, 1 ).normalize();
scene.add( directionalLight );

var pointLight = new THREE.PointLight( 0xffffff, 2, 800 );
particleLight.add( pointLight );

//

renderer = new THREE.WebGLRenderer( { antialias: true } );
renderer.setClearColor( 0x0a0a0a );
renderer.setPixelRatio( window.devicePixelRatio );
renderer.setSize( window.innerWidth, window.innerHeight );
renderer.sortObjects = true;

container.appendChild( renderer.domElement );

renderer.gammaInput = true;
renderer.gammaOutput = true;

//

stats = new Stats();
stats.domElement.style.position = 'absolute';
stats.domElement.style.top = '0px';

container.appendChild( stats.domElement );

controls = new THREE.OrbitControls( camera );
controls.target.set( 0, 0, 0 );
controls.update();

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

}

function onWindowResize() {

camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();

renderer.setSize( window.innerWidth, window.innerHeight );

}

//

function animate() {

requestAnimationFrame( animate );

render();
stats.update();

}

function render() {

var timer = Date.now() * 0.00025;

//camera.position.x = Math.cos( timer ) * 800;
//camera.position.z = Math.sin( timer ) * 800;

camera.lookAt( scene.position );

for ( var i = 0, l = objects.length; i < l; i ++ ) {

var object = objects[ i ];

object.rotation.y += 0.005;

}

particleLight.position.x = Math.sin( timer * 7 ) * 300;
particleLight.position.y = Math.cos( timer * 5 ) * 400;
particleLight.position.z = Math.cos( timer * 3 ) * 300;

renderer.render( scene, camera );

}

</script>

</body>
</html>
4 changes: 3 additions & 1 deletion src/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
#ifdef USE_ENVMAP
#if defined( USE_ENVMAP ) || defined( PHYSICAL )
uniform float reflectivity;
#endif

#ifdef USE_ENVMAP
#ifdef ENVMAP_TYPE_CUBE
uniform samplerCube envMap;
#else
Expand Down
2 changes: 1 addition & 1 deletion src/renderers/shaders/ShaderChunk/lights_pars.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ uniform vec3 ambientLightColor;

envMapColor.rgb = inputToLinear( envMapColor.rgb );

return envMapColor.rgb * reflectivity;
return envMapColor.rgb;

}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
PhysicalMaterial material;
material.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );
material.specularRoughness = roughnessFactor * 0.5 + 0.5; // disney's remapping of [ 0, 1 ] roughness to [ 0.5, 1 ]
material.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );
material.specularColor = mix( vec3( 0.08 ) * reflectivity, diffuseColor.rgb, metalnessFactor );