使用shader着色器程序创建扩散光圈效果(three.js实战10)

Posted 点燃火柴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用shader着色器程序创建扩散光圈效果(three.js实战10)相关的知识,希望对你有一定的参考价值。

使用着色器创建扩散光圈

1. demo效果

在这里插入图片描述

2. RawShaderMaterial介绍

我们之前在three.js中使用着色器,大多时候都是通过ShaderMaterial着色器材质传入着色器程序,使用这个着色器材质比较方便,因为three.js已经内置了很多常用的变量如position、color、normal、uv等,其实three.js还提供了另外一个着色器材质RawShaderMaterial,与ShaderMaterial相比唯一的区别就是去掉了上面提到的内置变量,需要什么变量完全自己定义,这一次就使用这个材质完全定义自己需要的变量编写着色器程序

3. demo代码

demo代码量较少,就不一一说明了,请直接查阅代码

<body>
  <div id="container"></div>
  <script type="text/javascript" src="../three/build/three.js"></script>

  <script>
    var container;
    var camera, scene, planeMesh, renderer;
    var vertexShader = `
    attribute vec3 position;//position变量从PlaneBufferGeometry的position属性中获取顶点信息
    varying vec3 v_position;
    void main() {
      v_position = position;
      gl_Position = vec4( position, 1.0 );
    }
    `
    var fragmentShader = `
    #ifdef GL_ES
    precision mediump float;
    #endif
    varying vec3 v_position;

    uniform float radius;
    
    void main( void ) {
      vec3 center = vec3(.0,.0,.0);
      float dist = distance(center,v_position);//计算中心到顶点的距离
      dist = clamp(dist,0.0,1.0);//将距离限制在0~1
      float color = 1.0 - dist;

      if(dist >radius-0.3&&dist < radius-0.28||dist >radius-0.4&&dist < radius-0.38){
        gl_FragColor = vec4(1.0*color,0.6*color,0.6*color,1.0);//绘制两层光圈
      }else{
        gl_FragColor = vec4(color*radius,0.0,0.0,1.0);//绘制底色
      }
        
    }
    `

    init();
    animate();

    function init() {
      container = document.getElementById('container');

      camera = new THREE.Camera();
      scene = new THREE.Scene();

      var geometry = new THREE.PlaneBufferGeometry(2, 2);

      //创建RawShaderMaterial着色器材质
      var material = new THREE.RawShaderMaterial({
        uniforms: {
          radius: {
            type: "f",
            value: 0.2
          }
        },
        vertexShader: vertexShader,
        fragmentShader: fragmentShader
      });

      planeMesh = new THREE.Mesh(geometry, material);

      scene.add(planeMesh);

      renderer = new THREE.WebGLRenderer();
      renderer.setSize(window.innerWidth, window.innerHeight);
      container.appendChild(renderer.domElement);

    }


    function animate() {
      requestAnimationFrame(animate);
      //更新光圈半径
      planeMesh.material.uniforms.radius.value += 0.01
      if (planeMesh.material.uniforms.radius.value > 1) {
        planeMesh.material.uniforms.radius.value = 0;
      }

      renderer.render(scene, camera);
    }
  </script>
</body>

以上是关于使用shader着色器程序创建扩散光圈效果(three.js实战10)的主要内容,如果未能解决你的问题,请参考以下文章

关于Unity中Shader的使用

shader是啥意思

shader几何运算效果

Godot Shader笔记:着色器材质ShaderMaterial

着色器编程_unity中的基础纹理,使用Unity Shader实现基础纹理的渲染效果

着色器编程_unity中的基础纹理,使用Unity Shader实现基础纹理的渲染效果