Three.js的Shader展示16张瓦片图

=<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Three.js Shader Example</title>
    <style>
        body { margin: 0; }
        canvas { display: block; }
    </style>
</head>
<body>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
    <script id="vertexShader" type="x-shader/x-vertex">
        varying vec2 vUv;
 
        void main() {
            vUv = uv;
            vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);
            gl_Position = projectionMatrix * mvPosition;
        }
    </script>
    <script id="fragmentShader" type="x-shader/x-fragment">
        uniform sampler2D textures[16];
        varying vec2 vUv;
 
        void main() {
            vec2 uv = vUv;
            float index = floor(mod(gl_FragCoord.x + gl_FragCoord.y, 16.0));
            vec4 color = texture2D(textures[int(index)], uv);
            gl_FragColor = color;
        }
    </script>
    <script>
        var scene = new THREE.Scene();
        var camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
 
        var renderer = new THREE.WebGLRenderer();
        renderer.setSize(window.innerWidth, window.innerHeight);
        document.body.appendChild(renderer.domElement);
 
        var geometry = new THREE.SphereGeometry(2, 32, 32);
        var material = new THREE.ShaderMaterial({
            vertexShader: document.getElementById('vertexShader').textContent,
            fragmentShader: document.getElementById('fragmentShader').textContent,
            uniforms: {
                textures: { value: [] }
            }
        });
 
        var sphere = new THREE.Mesh(geometry, material);
        scene.add(sphere);
 
        var textureLoader = new THREE.TextureLoader();
        var textures = [];
        var loadedTextures = 0;
        var totalTextures = 16;
 
        function loadTexture(index) {
            var textureUrl = 'path_to_your_texture_' + index + '.jpg';
            textureLoader.load(textureUrl, function(texture) {
                textures[index] = texture;
                loadedTextures++;
                if (loadedTextures === totalTextures) {
                    material.uniforms.textures.value = textures;
                }
            });
        }
 
        function checkCameraPosition() {
            if (camera.position.z < 10 && loadedTextures !== totalTextures) {
                for (var i = 0; i < totalTextures; i++) {
                    loadTexture(i);
                }
            }
        }
 
        function animate() {
            requestAnimationFrame(animate);
            renderer.render(scene, camera);
            checkCameraPosition();
        }
        animate();
    </script>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值