JSFiddle - React, Tailwind, and code Playground
by PhilQ
HTML
<script src="http://threejs.org/build/three.min.js"></script>
<script src="http://threejs.org/examples/js/controls/OrbitControls.js"></script>
<script id="vertexShader" type="x-shader/x-vertex">
uniform float width;
uniform float height;
varying float x;
varying float y;
void main() {
vec4 v = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
x = v.x;
y = v.y;
gl_Position = v;
}
</script>
<script id="fragmentShader" type="x-shader/x-vertex">
varying float x;
varying float y;
void main() {
gl_FragColor = vec4( 0.5 * x , 0.5 * y + 0.5, 0.0, 1.0 );
}
</script>
JavaScript
// experimenting with shaders
var container, renderer, scene, camera, controls, plane, customUniforms;
init();
animate();
function init() {
// renderer
renderer = new THREE.WebGLRenderer({
antialias: false
});
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setClearColor(0xccccff);
container = document.createElement('div');
document.body.appendChild(container);
container.appendChild(renderer.domElement);
// scene
scene = new THREE.Scene();
// camera
camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 10000);
camera.position.set(0, 200, 800);
camera.lookAt(scene.position);
// (camera) controls
// mouse controls: left button to rotate,
// mouse wheel to zoom, right button to pan
controls = new THREE.OrbitControls(camera, renderer.domElement);
customUniforms = {
width: {
type: "f",
value: window.innerWidth
},
height: {
type: "f",
value: window.innerHeight
}
};
var planeMaterial = new THREE.ShaderMaterial({
uniforms: customUniforms,
vertexShader: document.getElementById('vertexShader').textContent,
fragmentShader: document.getElementById('fragmentShader').textContent
});
var planeGeometry = new THREE.PlaneGeometry(500, 500, 10, 10);
plane = new THREE.Mesh(planeGeometry, planeMaterial);
scene.add(plane);
// events
window.addEventListener('resize', onWindowResize, false);
}
function onWindowResize(event) {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
}
function animate() {
controls.update();
renderer.render(scene, camera);
requestAnimationFrame(animate);
}