【问题标题】:Three.js. Why does this RGBA texture not change the associated material opacity?三.js。为什么这个 RGBA 纹理不会改变相关的材质不透明度?
【发布时间】:2019-09-07 00:54:51
【问题描述】:

在 three.js 中,我创建了一个使用纹理来控制透明度的材质。纹理是从画布创建的。画布是用 rgba 的 fillStyle 绘制的。 Alpha 在画布上有所不同。我所追求的效果是改变材质所附着对象的透明度。那没有发生。对象保持不透明。

代码:

tubeTexture = new THREE.Texture(canvas);
tubeTexture.center.set(0.5, 0.5);
tubeTexture.rotation = Math.PI/2.0;

// turn off any filtering to create sharp edges when highlighting
// tube section based on colorRamp highlighting.
tubeTexture.minFilter = tubeTexture.magFilter = THREE.NearestFilter;

// let tubeMaterial = new THREE.MeshBasicMaterial({ map: tubeTexture });
let tubeMaterial = new THREE.MeshPhongMaterial({ map: tubeTexture });
tubeMaterial.side = THREE.DoubleSide;
tubeMaterial.transparent = true;

// let tubeMaterial = sceneManager.stickMaterial.clone();
const tubeMesh = new THREE.Mesh(tubeGeometry, tubeMaterial);

我错过了什么?

【问题讨论】:

    标签: three.js html5-canvas texture-mapping alpha-transparency


    【解决方案1】:

    它似乎对我有用

    'use strict';
    
    /* global THREE */
    
    function main() {
      const canvas = document.querySelector('#c');
      const renderer = new THREE.WebGLRenderer({
        canvas: canvas
      });
    
      const fov = 75;
      const aspect = 2; // the canvas default
      const near = 0.1;
      const far = 5;
      const camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
      camera.position.z = 2;
    
      const scene = new THREE.Scene();
      scene.background = new THREE.Color('white');
    
      {
        const color = 0xFFFFFF;
        const intensity = 1;
        const light = new THREE.DirectionalLight(color, intensity);
        light.position.set(-1, 2, 4);
        scene.add(light);
      }
    
      const boxWidth = 1;
      const boxHeight = 1;
      const boxDepth = 1;
      const geometry = new THREE.BoxGeometry(boxWidth, boxHeight, boxDepth);
      
      const ctx = document.createElement('canvas').getContext('2d');
      ctx.canvas.width = 256;
      ctx.canvas.height = 256;
      ctx.fillStyle = 'rgba(255, 255, 255, 0.25)';
      ctx.beginPath();
      ctx.arc(128, 128, 120, 0, Math.PI * 2);
      ctx.fill();
      ctx.fillStyle = 'rgba(255, 255, 255, 0.5)';
      ctx.beginPath();
      ctx.arc(128, 128, 64, 0, Math.PI * 2);
      ctx.fill();
      ctx.fillStyle = 'rgba(255, 255, 255, 1.0)';
      ctx.beginPath();
      ctx.arc(128, 128, 32, 0, Math.PI * 2);
      ctx.fill();
      
      const texture = new THREE.CanvasTexture(ctx.canvas);
      
      const root = new THREE.Object3D();
      scene.add(root);
    
      function makeInstance(geometry, color, x) {
        const material = new THREE.MeshPhongMaterial({
          color,
          map: texture,
          transparent: true,
          side: THREE.DoubleSide,
          alphaTest: 0.1,
        });
    
        const cube = new THREE.Mesh(geometry, material);
        root.add(cube);
    
        cube.position.x = x;
    
        return cube;
      }
    
      const cubes = [
        makeInstance(geometry, 0x44aa88, 0),
        makeInstance(geometry, 0x8844aa, -2),
        makeInstance(geometry, 0xaa8844, 2),
      ];
    
      function resizeRendererToDisplaySize(renderer) {
        const canvas = renderer.domElement;
        const width = canvas.clientWidth;
        const height = canvas.clientHeight;
        const needResize = canvas.width !== width || canvas.height !== height;
        if (needResize) {
          renderer.setSize(width, height, false);
        }
        return needResize;
      }
    
      function render(time) {
        time *= 0.001;
    
        if (resizeRendererToDisplaySize(renderer)) {
          const canvas = renderer.domElement;
          camera.aspect = canvas.clientWidth / canvas.clientHeight;
          camera.updateProjectionMatrix();
        }
    
        root.rotation.y = time * .2;
    
        cubes.forEach((cube, ndx) => {
          const speed = 1 + ndx * .1;
          const rot = time * speed;
          cube.rotation.x = rot;
          cube.rotation.y = rot;
        });
    
        renderer.render(scene, camera);
    
        requestAnimationFrame(render);
      }
    
      requestAnimationFrame(render);
    }
    
    main();
    body {
      margin: 0;
    }
    
    #c {
      width: 100vw;
      height: 100vh;
      display: block;
    }
    <canvas id="c"></canvas>
    
    <script src="https://threejsfundamentals.org/threejs/resources/threejs/r103/three.min.js"></script>

    当然还有与透明度和排序相关的正常问题。一个对象不会始终对自己透明,只会对其他对象透明。

    【讨论】:

    • 我喜欢优雅简单的演示。 +1。
    猜你喜欢
    • 2017-12-18
    • 1970-01-01
    • 2016-03-01
    • 2019-01-02
    • 2013-11-11
    • 2023-03-27
    • 1970-01-01
    • 2021-12-17
    相关资源
    最近更新 更多