为什么带着色器的粒子系统不起作用? three.js所

时间:2013-03-29 05:32:58

标签: three.js shader particle-system

你们可以帮我这个吗?我有这个着色器,它适用于THREE.Mesh,但不适用于THREE.Particlesystem?

我希望每个粒子都有一个给定地图(纹理)的一部分并相应地改变它们的位置,如http://www.chromeexperiments.com/detail/webcam-displacement/?f=webgl

<script id="vs" type="x-shader/x-vertex">


            uniform sampler2D map;

            varying vec2 vUv;

            void main() {

                vUv = uv;

                vec4 color = texture2D( map, vUv );
                float value = ( color.r + color.g + color.b ) / 3.0;

                vec4 pos = vec4( position.xy, value * 100.0, 1.0 );

                                gl_PointSize = 20.0;

                gl_Position = projectionMatrix * modelViewMatrix * pos;

            }

        </script>

<script id="fs" type="x-shader/x-fragment">

            uniform sampler2D map;

            varying vec2 vUv;

            void main() {

                gl_FragColor = texture2D( map, vUv );

            }

</script>

1 个答案:

答案 0 :(得分:2)

ParticleSystem并不真正支持UV,因为没有面,只有单点。纹理映射粒子使用gl_PointCoord(IIRC)完成,但是它为每个粒子提供相同的映射。为了给每个粒子提供相同纹理的不同部分,你应该使用BufferGeometry,它在最新版本的three.js中支持所有属性,包括自定义属性(并且它非常高效和快速!)。然后,您将为每个粒子提供vec2偏移属性:从此偏移量和gl_PointCoord获得正确的UV。