JSFiddle - React, Tailwind, and code Playground
HTML
<script src="https://hofk.de/main/discourse.threejs/2020/js/three.min.112.js"></script>
<script src="https://hofk.de/main/discourse.threejs/2020/js/OrbitControls.js"></script>
<script src="https://hofk.de/main/discourse.threejs/2020/js/Tween.min.16.11.0.js"></script>
JavaScript
// @author prisoner849
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(60, 1, 1, 1000);
camera.position.set(0, 0, 4);
var renderer = new THREE.WebGLRenderer({
antialias: true
});
var canvas = renderer.domElement;
document.body.appendChild(canvas);
var controls = new THREE.OrbitControls(camera, canvas);
var tex = new THREE.TextureLoader().load('https://threejs.org/examples/textures/colors.png'
);
var texBack = new THREE.TextureLoader().load('https://threejs.org/examples/textures/uv_grid_opengl.jpg'
);
var planeMat = new THREE.MeshBasicMaterial({
map: tex,
side: THREE.DoubleSide,
wireframe: true
});
var planeUniforms = {
backTexture: { value: texBack }
};
planeMat.onBeforeCompile = shader => {
shader.uniforms.backTexture = planeUniforms.backTexture;
//console.log(shader.vertexShader);
shader.vertexShader =
`
attribute vec2 backUV;
varying vec2 vBackUV;
` + shader.vertexShader;
shader.vertexShader = shader.vertexShader.replace(
`#include <fog_vertex>`,
`#include <fog_vertex>
vBackUV = backUV;
`
);
shader.fragmentShader =
`
uniform sampler2D backTexture;
varying vec2 vBackUV;
` + shader.fragmentShader;
//console.log(shader.fragmentShader);
shader.fragmentShader = shader.fragmentShader.replace(
`#include <map_fragment>`,
`
#ifdef USE_MAP
vec4 texelColor = gl_FrontFacing ? texture2D( map, vUv ) : texture2D( backTexture, vBackUV );
texelColor = mapTexelToLinear( texelColor );
diffuseColor *= texelColor;
#endif
`
);
};
var planes = [];
for (let y = 0; y < 4; y++) {
for (let x = 0; x < 4; x++) {
let planeGeom = new THREE.PlaneBufferGeometry();
// re-calc uvs
let uv = planeGeom.attributes.uv;
uv.setXY(0, x * 0.25, y * 0.25 + 0.25);
uv.setXY(1, x * 0.25 + 0.25, y * 0.25 + 0.25);
uv.setXY(2, x * 0.25, y * 0.25);
uv.setXY(3, x * 0.25 + 0.25, y * 0.25);
planeGeom.setAttribute(
"backUV",
new THREE.Float32BufferAttribute([1, 1, 0, 1,...