web3d-three.js场景设计器-天空包围盒-TWEEN.js

本文介绍了如何在THREE.JS中实现场景的天空包围盒效果,通过球体结构和自定义shader实现动态渐变色,使背景不再单调。
摘要由CSDN通过智能技术生成

THREE.JS 实现场景天空包围盒,为了让场景背景更具体,而不是呆板的纯色,可以给厂家添加围绕的包围盒。

  • 这里使用球体来实现,球体中央则是场景
  • 给球体添加天空的渐变色
  • 加入场景

代码如下

function createSky( hemiLight) {

  const vertexShader = `varying vec3 vWorldPosition;

    void main() {

        vec4 worldPosition = modelMatrix * vec4( position, 1.0 );

        vWorldPosition = worldPosition.xyz;

        gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );

    }`

  const fragmentShader = `uniform vec3 topColor;

    uniform vec3 bottomColor;

    uniform float offset;

    uniform float exponent;

    varying vec3 vWorldPosition;

    void main() {

        float h = normalize( vWorldPosition + offset ).y;

        // 从-0.2 到1做渐变

        h = smoothstep(-0.4, 1.0, h);  

        gl_FragColor = vec4( mix( bottomColor, topColor, max( pow( max( h , 0.0), exponent ), 0.0 ) ), 1.0 );

    }`

  const uniforms = {

    'topColor': { value: new THREE.Color(0x0077ff) },

    'bottomColor': { value: new THREE.Color(0xeeeeee) },

    'offset': { value: 30 },

    'exponent': { value: 0.6 }

  }

  uniforms['topColor'].value.copy(hemiLight.color)

  // scene.fog.color.copy( uniforms[ 'bottomColor' ].value );

  const skyGeo = new THREE.SphereGeometry(4000, 32, 15)

  const skyMat = new THREE.ShaderMaterial({

    uniforms: uniforms,

    vertexShader: vertexShader,

    fragmentShader: fragmentShader,

    side: THREE.BackSide

  })

  const sky = new THREE.Mesh(skyGeo, skyMat)

  return sky

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

11eleven

你的鼓励是我创作的动力 !

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值