threejs内发光和外发光

参考文章链接:使用threejs实现地球辉光和大气层效果

效果:
在这里插入图片描述
代码:


var vertexShader = [
    'varying vec3	vVertexWorldPosition;',
    'varying vec3	vVertexNormal;',
    'varying vec4	vFragColor;',
    'void main(){',
    '	vVertexNormal	= normalize(normalMatrix * normal);',//将法线转换到视图坐标系中
    '	vVertexWorldPosition	= (modelMatrix * vec4(position, 1.0)).xyz;',//将顶点转换到世界坐标系中
    '	// set gl_Position',
    '	gl_Position	= projectionMatrix * modelViewMatrix * vec4(position, 1.0);',
    '}'

].join('\n');
//大气层效果
THREE.AeroSphere = {
    uniforms: {
        coeficient: {
            type: "f",
            value: 1.0
        },
        power: {
            type: "f",
            value: 2
        },
        glowColor: {
            type: "c",
            value: new THREE.Color(0xffff00)
        }
    },
    vertexShader: vertexShader,
    fragmentShader: [
        'uniform vec3	glowColor;',
        'uniform float	coeficient;',
        'uniform float	power;',

        'varying vec3	vVertexNormal;',
        'varying vec3	vVertexWorldPosition;',

        'varying vec4	vFragColor;',

        'void main(){',
        '	vec3 worldCameraToVertex= vVertexWorldPosition - cameraPosition;',	//世界坐标系中从相机位置到顶点位置的距离
        '	vec3 viewCameraToVertex	= (viewMatrix * vec4(worldCameraToVertex, 0.0)).xyz;',//视图坐标系中从相机位置到顶点位置的距离
        '	viewCameraToVertex	= normalize(viewCameraToVertex);',//规一化
        '	float intensity		= pow(coeficient + dot(vVertexNormal, viewCameraToVertex), power);',
        '	gl_FragColor		= vec4(glowColor, intensity);',
        '}'//vVertexNormal视图坐标系中点的法向量
        //viewCameraToVertex视图坐标系中点到摄像机的距离向量
        //dot点乘得到它们的夹角的cos值
        //从中心向外面角度越来越小(从钝角到锐角)从cos函数也可以知道这个值由负变正,不透明度最终从低到高
    ].join('\n')

//辉光效果Grow
THREE.GlowSphere = {
    uniforms: {
        coeficient: {
            type: "f",
            value: 0.0
        },
        power: {
            type: "f",
            value: 2
        },
        glowColor: {
            type: "c",
            value: new THREE.Color(0xff22ff)
        }
    },
    vertexShader: vertexShader,
    fragmentShader: [
        'uniform vec3	glowColor;',
        'uniform float	coeficient;',
        'uniform float	power;',

        'varying vec3	vVertexNormal;',
        'varying vec3	vVertexWorldPosition;',

        'varying vec4	vFragColor;',

        'void main(){',
        '	vec3 worldVertexToCamera= cameraPosition - vVertexWorldPosition;',	//世界坐标系中顶点位置到相机位置到的距离
        '	vec3 viewCameraToVertex	= (viewMatrix * vec4(worldVertexToCamera, 0.0)).xyz;',//视图坐标系中从相机位置到顶点位置的距离
        '	viewCameraToVertex	= normalize(viewCameraToVertex);',//规一化
        '	float intensity		= coeficient + dot(vVertexNormal, viewCameraToVertex);',
        '	if(intensity > 0.65){ intensity = 0.0;}',
        '	gl_FragColor		= vec4(glowColor, intensity);',
        '}'//vVertexNormal视图坐标系中点的法向量
        //viewCameraToVertex视图坐标系中点到摄像机的距离向量
        //dot点乘得到它们的夹角的cos值
        //从中心向外面角度越来越大(从锐角到钝角)从cos函数也可以知道这个值由负变正,不透明度最终从高到低
    ].join('\n')
}

//球体 辉光 大气层
    function shad() {        
        var material1 = new THREE.ShaderMaterial({
            uniforms: THREE.AeroSphere.uniforms,
            vertexShader: THREE.AeroSphere.vertexShader,
            fragmentShader: THREE.AeroSphere.fragmentShader,
            blending: THREE.NormalBlending,
            transparent: true,
            depthWrite:false
        });
        var material2 = new THREE.ShaderMaterial({
            uniforms: THREE.GlowSphere.uniforms,
            vertexShader: THREE.GlowSphere.vertexShader,
            fragmentShader: THREE.GlowSphere.fragmentShader,
            blending: THREE.NormalBlending,
            transparent: true
        });
        var sphere = new THREE.SphereBufferGeometry(16, 32, 32);
        var mesh = new THREE.Mesh(sphere, material1);
        scene.add(mesh);

        var sphere2 = new THREE.SphereBufferGeometry(10, 32, 32);
        var mesh2 = new THREE.Mesh(sphere2, material2);
        //mesh2.position.x = 15;
        scene.add(mesh2);
    }

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Threejs是一款强大的基于WebGL的JavaScript 3D图形库,它支持多种材质类型,包括透明和发光。透明和发光通常被用于创建真实感的光影效果、特效、和 UI 元素。因此,理解如何在Threejs中实现透明和发光是非常有用的。 在Threejs中实现透明材质,需要使用带有透明度属性的材质类型,比如THREE.MeshBasicMaterial和THREE.MeshPhongMaterial。透明度属性可以使用0到1之间的值进行调整,数值越小,材质越透明。开启透明属性后,需要确保场景内的其它物体都正确渲染,因为透明的物体会影响其它物体的呈现。 如果想在Threejs中实现发光效果,需要使用THREE.MeshBasicMaterial和THREE.MeshLambertMaterial,因为它们支持emissive属性。emissive属性可以让材质在渲染时自行发光,颜色和强度可以自定义。发光效果也常被用于给UI元素和特效添加光芒。 如果要同时在Threejs中实现透明和发光,可以使用THREE.MeshStandardMaterial。除了具有透明度和emissive属性,它还支持roughness属性和metalness属性,用于设置光泽度和金属感。结合使用这些属性,可以实现非常逼真的材质效果。 总之,Threejs在透明和发光方面的支持非常强大,我们只需要选择相应的材质类型,优化场景设置,就可以轻松实现透明和发光效果。 ### 回答2: threejs是一个用于创建三维动画的JavaScript库,通过使用其内置的材质和光源,可以轻松实现透明和发光的效果。 透明效果可以通过设置材质的opacity属性来实现,该属性值为0到1之间的浮点数,值越小表示透明度越高。可以使用如下的代码实现透明效果: ```javascript var material = new THREE.MeshBasicMaterial({ color: 0xffffff, transparent: true, opacity: 0.5 }); ``` 发光效果可以通过设置材质的emissive属性来实现,该属性表示材质的自发光颜色,可以设定为一个RGB颜色值,例如: ```javascript var material = new THREE.MeshBasicMaterial({ color: 0xffffff, emissive: 0x00ff00, emissiveIntensity: 0.5 }); ``` 其中,emissiveIntensity属性表示发光强度,取值范围为0到1之间的浮点数。 同时,当透明和发光效果结合在一起时,可以创建一个非常炫酷的效果。例如,可以创建一个透明的立方体,并设置其边缘发出绿色的光: ```javascript var material = new THREE.MeshBasicMaterial({ color: 0xffffff, transparent: true, opacity: 0.5, emissive: 0x00ff00, emissiveIntensity: 0.5 }); var geometry = new THREE.BoxGeometry(1, 1, 1); var mesh = new THREE.Mesh(geometry, material); scene.add(mesh); ``` 这样创建的立方体将会呈现出半透明,边缘发出绿色光的效果,给人一种非常酷炫的感觉。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值