three.js实现建筑物纹理流动

three.js实现建筑物纹理流动

在知乎写第一篇软文哈,略有点小慌,最近一直在做智慧城市,大多特效特效我已实现,以往看着牛逼的智慧城市感觉也就那样,第一篇文章来点干货吧,废话不多说本文主要实现建筑物纹理流动的特效。

参考特效来源于thing.js demo

效果:

我实现的效果:

四个重点:

一、如何只贴建筑的周围,顶部和底部不贴

原理:采用归一化的法向量,由于归一化之后顶部法向量为(0.0,1.0,0.0),而底部法向量则为(0.0,-1.0,0.0)我们仅需要判断y值即可判断顶面或者底面,即:

                       vec3 tempNomal= normalize(fNormal);                       float power=step(0.95,abs(tempNomal.y));

在上面我们转换为求y的绝对值,通过绝对值来判断。

二、建筑流动的着色器:

1、顶点着色器

                    varying vec2 vUv;                    varying vec3 fNormal;                    varying vec3 vPosition;                    void main()                    {                        vUv = uv;                        fNormal=normal;                        vPosition=position;                        vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );                        gl_Position = projectionMatrix * mvPosition;                    }

2、片源着色器

                    uniform float time;                    varying vec2 vUv;                    uniform sampler2D colorTexture;                    uniform sampler2D colorTexture1;                    varying vec3 fNormal;                    varying vec3 vPosition;                    void main( void ) {                        vec2 position = vUv;                        vec3 tempNomal= normalize(fNormal);                        float power=step(0.95,abs(tempNomal.y));                        vec4 colorb=texture2D(colorTexture1,position.xy);                        vec4 colora = texture2D(colorTexture,vec2(vUv.x,fract(vUv.y-time)));                         if(power>0.95){                            gl_FragColor =colorb;                        }else{                            gl_FragColor =colorb+colorb*colora;                              }                             }

3、ShaderMaterial参数

        let  material = new ShaderMaterial({            uniforms: this._uniforms,            vertexShader: shader.vs ,            fragmentShader: shader.fs,            blending: AdditiveBlending,            transparent:true,            depthTest: false,            side: DoubleSide,            //polygonOffset:true        });

4、uniform参数更改

         this._uniforms.time.value += 0.01;

本文转自 https://zhuanlan.zhihu.com/p/198009027,如有侵权,请联系删除

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部