forked from mrdoob/three.js
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add Texture 2D array example and rename Texture 3D volume example to …
…Texture 3D example
- Loading branch information
Showing
4 changed files
with
401 additions
and
403 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,212 @@ | ||
<!DOCTYPE html> | ||
<html lang="en"> | ||
<head> | ||
<title>three.js webgl - 2D texture array</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 { | ||
background:#000; | ||
padding:0; | ||
margin:0; | ||
overflow:hidden; | ||
} | ||
|
||
#info { | ||
position: absolute; | ||
top: 0px; | ||
width: 100%; | ||
color: #ffffff; | ||
padding: 5px; | ||
font-family:Monospace; | ||
font-size:13px; | ||
text-align:center; | ||
} | ||
|
||
#info a { | ||
color: #ffffff; | ||
} | ||
</style> | ||
</head> | ||
<script id="vs" type="x-shader/x-vertex"> | ||
#version 300 es | ||
|
||
uniform vec2 size; | ||
out vec2 vUv; | ||
|
||
void main() { | ||
|
||
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); | ||
|
||
// Convert position.xy to 1.0-0.0 | ||
|
||
vUv.xy = position.xy / size + 0.5; | ||
vUv.y = 1.0 - vUv.y; // original data is upside down | ||
|
||
} | ||
</script> | ||
|
||
<script id="fs" type="x-shader/x-fragment"> | ||
#version 300 es | ||
|
||
precision highp float; | ||
precision highp int; | ||
precision highp sampler2DArray; | ||
|
||
uniform sampler2DArray diffuse; | ||
in vec2 vUv; | ||
uniform int depth; | ||
out vec4 out_FragColor; | ||
|
||
void main() { | ||
|
||
vec4 color = texture( diffuse, vec3( vUv, depth ) ); | ||
|
||
// lighten a bit | ||
out_FragColor = vec4( color.rrr * 1.5, 1.0 ); | ||
|
||
} | ||
</script> | ||
<body> | ||
<div id="info"> | ||
<a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> - 2D Texture array<br /> | ||
Scanned head data by | ||
<a href="https://www.codeproject.com/Articles/352270/Getting-started-with-Volume-Rendering" target="_blank" rel="noopener">Divine Augustine</a><br /> | ||
licensed under | ||
<a href="https://www.codeproject.com/info/cpol10.aspx" target="_blank" rel="noopener">CPOL</a> | ||
</div> | ||
|
||
<script src="../build/three.js"></script> | ||
<!--<script src="js/controls/OrbitControls.js"></script>--> | ||
|
||
<script src="js/libs/jszip.min.js"></script> | ||
<script src="js/libs/stats.min.js"></script> | ||
<script src="js/WebGL.js"></script> | ||
|
||
<script> | ||
|
||
if ( WEBGL.isWebGL2Available() === false ) { | ||
|
||
document.body.appendChild( WEBGL.getWebGL2ErrorMessage() ); | ||
|
||
} | ||
|
||
var camera, scene, mesh, renderer, stats; | ||
|
||
var planeWidth = 50; | ||
var planeHeight = 50; | ||
|
||
var depthStep = 0.5; | ||
|
||
init(); | ||
animate(); | ||
|
||
function init() { | ||
|
||
var container = document.createElement( 'div' ); | ||
document.body.appendChild( container ); | ||
|
||
camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 0.1, 2000 ); | ||
camera.position.z = 70; | ||
|
||
scene = new THREE.Scene(); | ||
|
||
// width 256, height 256, depth 109, 8-bit, zip archived raw data | ||
|
||
new THREE.FileLoader() | ||
.setResponseType( 'arraybuffer' ) | ||
.load( 'textures/3d/head256x256x109.zip', function ( data ) { | ||
|
||
var zip = new JSZip( data ); | ||
var array = zip.files[ 'head256x256x109' ].asUint8Array(); | ||
|
||
var texture = new THREE.DataTexture2DArray( array, 256, 256, 109 ); | ||
|
||
texture.format = THREE.RedFormat; | ||
texture.type = THREE.UnsignedByteType; | ||
|
||
texture.needsUpdate = true; | ||
|
||
var material = new THREE.ShaderMaterial( { | ||
uniforms: { | ||
diffuse: { value: texture }, | ||
depth: { value: 0 }, | ||
size: { value: new THREE.Vector2( planeWidth, planeHeight ) } | ||
}, | ||
vertexShader: document.getElementById( 'vs' ).textContent.trim(), | ||
fragmentShader: document.getElementById( 'fs' ).textContent.trim() | ||
} ); | ||
|
||
var geometry = new THREE.PlaneBufferGeometry( planeWidth, planeHeight ); | ||
|
||
mesh = new THREE.Mesh( geometry, material ); | ||
|
||
scene.add( mesh ); | ||
|
||
} ); | ||
|
||
// var controls = new THREE.OrbitControls( camera ); | ||
|
||
// 2D Texture array is available on WebGL 2.0 | ||
|
||
var canvas = document.createElement( 'canvas' ); | ||
var context = canvas.getContext( 'webgl2' ); | ||
|
||
renderer = new THREE.WebGLRenderer( { antialias: true, canvas: canvas, context: context } ); | ||
renderer.setPixelRatio( window.devicePixelRatio ); | ||
renderer.setSize( window.innerWidth, window.innerHeight ); | ||
container.appendChild( renderer.domElement ); | ||
|
||
stats = new Stats(); | ||
container.appendChild( stats.dom ); | ||
|
||
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 ); | ||
|
||
if ( mesh ) { | ||
|
||
var value = mesh.material.uniforms[ "depth" ].value; | ||
|
||
value += depthStep; | ||
|
||
if ( value > 109.0 || value < 0.0 ) { | ||
|
||
if ( value > 1.0 ) value = 109.0 * 2.0 - value; | ||
if ( value < 0.0 ) value = - value; | ||
|
||
depthStep = - depthStep; | ||
|
||
} | ||
|
||
mesh.material.uniforms[ "depth" ].value = value; | ||
|
||
} | ||
|
||
render(); | ||
stats.update(); | ||
|
||
} | ||
|
||
function render() { | ||
|
||
renderer.render( scene, camera ); | ||
|
||
} | ||
|
||
</script> | ||
</body> | ||
</html> |
Oops, something went wrong.