three.js 实现辉光(原生JS)

在three.js后期处理中,实现通道辉光效果,效果图如下:

 一、模型创建

        在三维场景中,创建了两个对象mesh(正方体)bmesh(球体)

//创建模型
            //正方体
        var geometry = new THREE.BoxGeometry(100,100,100);
        var material = new THREE.MeshLambertMaterial({
            color:0x0000ff
        });
        var mesh = new THREE.Mesh(geometry,material);
        mesh.layers.set(0);
        scene.add(mesh);
            //球体
        var bgeometry = new THREE.SphereGeometry(60,40,40);
        var bmaterial  = new THREE.MeshLambertMaterial({ 
            color: 0xff5500,
            transparent:true,
            opacity:0.8,
            wireframe:true
        });
        var bmesh = new THREE.Mesh(bgeometry,bmaterial);
        bmesh.position.y = 100;
        bmesh.layers.set(1);
        scene.add(bmesh);

        PS:如果仅实现全场景的全局辉光效果,可直接在场景中进行后述光晕的设置,但是为了实现局部辉光,让一个物体发光,另一个物体正常显示,我们采用layer图层显示,对两个对象设置不同的图层,以实现不同的渲染显示。

二、光晕设置

        这里需要用到如下三个对象,需要从three中导包

import { RenderPass } from "./three/examples/jsm/postprocessing/RenderPass.js";
import { UnrealBloomPass} from "./three/examples/jsm/postprocessing/UnrealBloomPass.js";
import { EffectComposer } from "./three/examples/jsm/postprocessing/EffectComposer.js";

        通过构造函数,创建对象如下:

//设置光晕
        var composer = new EffectComposer(renderer);        //效果组合器
            //创建通道
        var renderScene = new RenderPass(scene, camera);    
            //创建通道
        var bloomPass = new UnrealBloomPass(
            //参数一:泛光覆盖场景大小,二维向量类型
            new THREE.Vector2(window.innerWidth, window.innerHeight),
            //参数二:bloomStrength 泛光强度,值越大明亮的区域越亮,较暗区域变亮的范围越广
            1.5,
            //参数三:bloomRadius 泛光散发半径
            0.3,
            //参数四:bloomThreshold 泛光的光照强度阈值,如果照在物体上的光照强度大于该值就会产生泛光
            0.75
        );

        赋值间接对象,组合composer

//赋值间接对象
            var params = {
            exposure: 0,
            bloomStrength: 1.5,
            bloomThreshold: 0,
            bloomRadius: 0,
            };
                bloomPass.threshold = params.bloomThreshold;
                bloomPass.strength = params.bloomStrength;
                bloomPass.radius = params.bloomRadius;
                composer.addPass(renderScene);
                composer.addPass(bloomPass);

三、渲染

function render(){
            camera.layers.set(0);
            composer.render();
            camera.layers.set(1);   
            renderer.render(scene, camera);
            requestAnimationFrame(render);
        }
render();

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
three.js实现辉光效果可以使用ShaderMaterial和PostProcessing来实现。以下是一个简单的实现步骤: 1. 创建一个ShaderMaterial来渲染模型,该材质包含一个自定义的fragment shader,用于实现辉光效果。 ```javascript const glowMaterial = new THREE.ShaderMaterial({ uniforms: { "c": { type: "f", value: 0.2 }, "p": { type: "f", value: 3.0 }, glowColor: { type: "c", value: new THREE.Color(0xffffff) }, viewVector: { type: "v3", value: camera.position } }, vertexShader: document.getElementById('vertexShader').textContent, fragmentShader: document.getElementById('fragmentShader').textContent, side: THREE.FrontSide, blending: THREE.AdditiveBlending, transparent: true }); ``` 2. 创建一个自定义的fragment shader,用于实现辉光效果。该shader通过计算法向量和视线向量之间的角度来确定辉光的大小和颜色。 ```glsl uniform vec3 glowColor; uniform vec3 viewVector; varying vec3 vNormal; void main() { float intensity = pow(c - dot(vNormal, viewVector), p); gl_FragColor = vec4(glowColor, intensity); } ``` 3. 将该材质应用于模型上。 ```javascript const mesh = new THREE.Mesh(geometry, glowMaterial); scene.add(mesh); ``` 4. 使用PostProcessing技术,在屏幕上渲染出辉光效果。这可以通过创建一个RenderPass和一个ShaderPass来实现。 ```javascript const renderPass = new THREE.RenderPass(scene, camera); const glowComposer = new THREE.EffectComposer(renderer); glowComposer.addPass(renderPass); const glowPass = new THREE.ShaderPass({ uniforms: { "tDiffuse": { value: null }, "glowColor": { value: new THREE.Color(0xffffff) } }, vertexShader: document.getElementById('vertexShader').textContent, fragmentShader: document.getElementById('glowFragmentShader').textContent, blending: THREE.AdditiveBlending, transparent: true }); glowComposer.addPass(glowPass); const finalPass = new THREE.ShaderPass({ uniforms: { "tDiffuse": { value: null }, "tGlow": { value: glowComposer.renderTarget2.texture } }, vertexShader: document.getElementById('vertexShader').textContent, fragmentShader: document.getElementById('finalFragmentShader').textContent }); composer.addPass(finalPass); ``` 5. 创建自定义的fragment shaders,用于在屏幕上渲染出辉光效果。 ```glsl //glowFragmentShader uniform vec3 glowColor; varying vec2 vUv; void main() { vec4 sum = vec4(0.0); vec2 texelSize = vec2(1.0 / resolution.x, 1.0 / resolution.y); for (int i = -2; i <= 2; i++) { for (int j = -2; j <= 2; j++) { vec2 offset = vec2(float(i), float(j)) * texelSize; sum += texture2D(tDiffuse, vUv + offset); } } gl_FragColor = sum / 25.0; gl_FragColor += vec4(glowColor, 1.0); } //finalFragmentShader uniform sampler2D tDiffuse; uniform sampler2D tGlow; varying vec2 vUv; void main() { vec4 texel = texture2D(tDiffuse, vUv); vec4 glow = texture2D(tGlow, vUv); gl_FragColor = texel + glow; } ``` 通过以上步骤,就可以在three.js实现辉光效果了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值