shader之渐变长方体实现(threejs)

shader之渐变长方体实现(threejs)

效果:

原理:

1.用varying将position(位置)、normal(法线)从顶点着色器传递到片元着色器

2.假设长方体高为40,将fract(vPosition.y)设置为gl_FragColor的色值可看到40行渐变:

3.通过除以长方体高可得:float cy = fract(vPosition.y/40.0);

4.通过位移计算可得颜色从0到1的渐变:float cy = fract((vPosition.y - 20.0) / 40.0);

 

5.通过位移和拉伸可控制取渐变中的一部分效果:float cy = (fract((vPosition.y - 20.0) / 40.0) + 0.7) * 0.7;

6.得到最终效果

完整着色器代码:

                let v=`    
                        varying vec3 vNormal;
                        varying vec3 vPosition;
                            void main() {
                                //将attributes的normal通过varying赋值给了向量vNormal
                            vNormal = normal;
                            vPosition = position;
                                //projectionMatrix是投影变换矩阵 modelViewMatrix是相机坐标系的变换矩阵
                            gl_Position = projectionMatrix * modelViewMatrix * vec4( position.x, position.y, position.z, 1.0 );
                        }
                `

                let f =`
                        varying vec3 vNormal;
                        varying vec3 vPosition;
                        void main() {
                            float cy = (fract((vPosition.y - 20.0) / 40.0) + 0.7) * 0.7;
                            if(vNormal.x==0.0&&vNormal.y==1.0&&vNormal.z==0.0){
                                cy = 1.0;
                            }
                            gl_FragColor = vec4(0.0, cy, cy, 1.0);
                        }
                    `

 

合作:@浩

钻研不易,转载请注明出处。。。。。。

 

 

 

posted @ 2021-01-23 11:36  莫小龙  阅读(3742)  评论(0编辑  收藏  举报