JavaScript
import * as THREE from 'three/webgpu';
import { Loop,texture3D, texture, time, abs, pow, mix, normalLocal, modelNormalMatrix, mul, positionLocal, mx_noise_float, color, cross, dot, float,bufferAttribute, transformNormalToView, sign, step, Fn, uniform, varying, vec2, vec3, uniformArray, uniformGroup, sin } from 'three/tsl';
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
let camera, scene, renderer, controls;
const offset = new THREE.Vector2();
const TEXTURE_SIZE = 64;
const baseTexture = createPatternTexture(TEXTURE_SIZE);
console.log("BT: ", baseTexture);
const tslTex = uniform(baseTexture);
const colorSand = uniform(color('#e62861'))
/// MAKE A DATA TEXTURE
function createPatternTexture() {
const data = new Uint8Array(TEXTURE_SIZE * TEXTURE_SIZE * 4);
const colors = [
[0, 0, 0], // Black
[2, 0, 0],
[4, 0, 0],
[8, 0, 0], // Red
[16, 0, 0], // Green
[32, 0, 0], // Blue
[64, 0, 0],
[128, 0, 0],
[255, 0, 0],
];
for (let y = 0; y < TEXTURE_SIZE; y++) {
for (let x = 0; x < TEXTURE_SIZE; x++) {
const colorIndex = Math.floor(Math.random() * 8); // Pattern repeats every 2 pixels
const color = colors[colorIndex];
const index = (y * TEXTURE_SIZE + x) * 4;
data[index] = color[0];
data[index + 1] = color[1];
data[index + 2] = color[2];
data[index + 3] = 0
}
}
console.log("data:", data);
const texture = new THREE.DataTexture(data, TEXTURE_SIZE, TEXTURE_SIZE);
texture.needsUpdate = true;
texture.magFilter = THREE.NearestFilter; // To keep sharp edges of the pattern
texture.minFilter = THREE.NearestFilter;
return texture;
}
//// DATA TEXTURE NOW AVAILABLE
const material = new THREE.MeshStandardNodeMaterial({
metalness: 0.5,
roughness: 0.8,
//color: '#85d534',
side: THREE.DoubleSide,
transparent: true,
opacity:0.96
})
init();
function init() {
// Camera
camera = new...