• Three.js添加阴影和简单后期处理


    在Three.js中,可以使用渲染器的一些特性来实现阴影和后期处理效果。

    添加阴影

    要在Three.js中添加阴影效果,需要做以下几个步骤:

    1.开启阴影

    首先,要在渲染器中开启阴影:

    renderer.shadowMap.enabled = true;
    
    • 1
    2.设置渲染目标

    接着,需要将灯光的castShadow属性以及需要产生阴影的物体的receiveShadow属性都设置成true。例如:

    var light = new THREE.DirectionalLight(0xffffff, 1);
    light.position.set(0, 10, 0);
    light.castShadow = true;
    scene.add(light);
    
    var cubeGeometry = new THREE.BoxGeometry(2, 2, 2);
    var cubeMaterial = new THREE.MeshStandardMaterial({
        color: 0x00ff00
    });
    var cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
    cube.position.set(0, 1, 0);
    cube.receiveShadow = true; // 接收阴影
    scene.add(cube);
    
    var planeGeometry = new THREE.PlaneGeometry(20, 20, 1, 1);
    var planeMaterial = new THREE.MeshStandardMaterial({
        color: 0xCCCCCC
    });
    var plane = new THREE.Mesh(planeGeometry, planeMaterial);
    plane.rotation.x = -Math.PI / 2;
    plane.position.y = -1;
    plane.receiveShadow = true; // 接收阴影
    scene.add(plane);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    注意,为了获得更加逼真的阴影效果,材质需要使用MeshStandardMaterial。而且,需要将其设置的足够暗。

    3.调整光源

    为了产生更加真实的阴影效果,还需要调整灯光的参数:

    light.shadow.camera.near = 0.5;
    light.shadow.camera.far = 500;
    light.shadow.camera.left = -100;
    light.shadow.camera.right = 100;
    light.shadow.camera.top = 100;
    light.shadow.camera.bottom = -100;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    此外,还可以通过以下代码调整阴影分辨率和模糊度:

    renderer.shadowMap.type = THREE.PCFSoftShadowMap; // 预过滤模糊
    renderer.shadowMap.bias = 0.0039; // 阴影偏移量
    renderer.shadowMap.width = 2048; // 分辨率宽度
    renderer.shadowMap.height = 2048; // 分辨率高度
    
    • 1
    • 2
    • 3
    • 4

    这些参数需要根据场景的大小、光源的位置以及需要产生阴影的物体的大小和形状来进行调整。通过修改这些参数,可以得到不同的阴影效果。

    添加后期处理效果

    在Three.js中,可以使用PostProcessing功能添加各种后期处理效果,例如模糊、色彩校正等。

    要使用后期处理效果,需要用到以下几个类:

    • EffectComposer: 后期处理渲染器
    • RenderPass: 渲染通道
    • ShaderPass: 自定义着色器通道
    • CopyShader: 复制着色器通道(用于将图像复制到屏幕上)

    下面是一个简单的例子,展示了如何使用后期处理效果:

    // 创建渲染器、相机和场景
    var renderer = new THREE.WebGLRenderer();
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(renderer.domElement);
    var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000);
    camera.position.z = 5;
    var scene = new THREE.Scene();
    
    // 加载模型
    var loader = new THREE.GLTFLoader();
    loader.load('model.gltf', function (gltf) {
        var model = gltf.scene;
        scene.add(model);
    
        // 设置需要产生阴影的物体
        model.traverse(function (child) {
            if (child.isMesh) {
                child.castShadow = true;
                child.receiveShadow = true;
            }
        });
    
        // 添加灯光
        var light = new THREE.DirectionalLight(0xffffff, 1);
        light.position.set(0, 10,0);
        light.castShadow = true;
        scene.add(light);
    
                // 创建后期处理渲染器
    var composer = new THREE.EffectComposer(renderer);
    composer.setSize(window.innerWidth, window.innerHeight);
    
    // 添加渲染通道
    var renderPass = new THREE.RenderPass(scene, camera);
    composer.addPass(renderPass);
    
    // 添加自定义着色器通道(模糊)
    var blurShader = new THREE.ShaderPass(THREE.VerticalBlurShader);
    blurShader.uniforms["v"].value = 0.01; // 模糊度
    composer.addPass(blurShader);
    
    // 添加自定义着色器通道(色彩校正)
    var vignetteShader = new THREE.ShaderPass(THREE.VignetteShader);
    vignetteShader.uniforms["offset"].value = 1.0; // 色彩校正强度
    composer.addPass(vignetteShader);
    
    // 添加复制着色器通道
    var copyShader = new THREE.ShaderPass(THREE.CopyShader);
    copyShader.renderToScreen = true;
    composer.addPass(copyShader);
    
    // 渲染场景
    function render() {
        requestAnimationFrame(render);
        renderer.render(scene, camera);
        composer.render();
    }
    render();
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    这个例子中使用了两个自定义的着色器通道:VerticalBlurShaderVignetteShader。其中,VerticalBlurShader为垂直方向上的高斯模糊着色器,可以实现模糊效果;VignetteShader为暗角着色器,可以使图像边缘变暗,产生色彩校正效果。

    需要注意的是,在使用后期处理渲染器时,需要在渲染通道之外添加着色器通道,并将最后一个通道的renderToScreen属性设置为true,以便将图像复制到屏幕上。

    以上就是在Three.js中添加阴影和后期处理效果的基本方法。每种效果的具体实现方式可能会有所不同,需要根据场景和需求进行调整。

  • 相关阅读:
    【软件工程导论】软件工程导论笔记
    钉钉事件订阅AES_KEY解密失败踩坑
    某光伏行业头部企业联合谢宁老师《向华为学习 业务领先的战略规划SP(BLM)和战略解码BP(BEM)》训战内训成功举办
    2023-10-11 LeetCode每日一题()
    算法练习(一)汉诺塔
    Java内部类
    痞子衡嵌入式:说说职业生涯第一个十年
    app毕业设计开题报告-基于Uniapp实现的移动端的医生挂号就诊平台
    用Python把附近的足浴店都给采集了一遍,好兄弟:针不戳~
    Bean装配相关注解使用说明
  • 原文地址:https://blog.csdn.net/lin5165352/article/details/128447543