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

效果:

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

原理:

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

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

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

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

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

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

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

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);
                        }
                    `

 

合作:@浩

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

 

 

 

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-04
  • 2021-12-05
  • 2021-12-05
  • 2021-12-12
猜你喜欢
  • 2022-12-23
  • 2022-01-10
  • 2021-11-02
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-12
相关资源
相似解决方案