почему система частиц с шейдером не работает? три.js

Привет, кто-нибудь может помочь мне с этим? У меня есть этот шейдер, он работает с 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>

person Memo Lestas    schedule 29.03.2013    source источник


Ответы (1)


ParticleSystem на самом деле не поддерживает UV-развертку, так как в ней нет лиц, а только отдельные точки. Отображение текстуры частиц выполняется с помощью gl_PointCoord (IIRC), но это дает вам одинаковое отображение для каждой частицы. Чтобы дать каждой частице разные части одной и той же текстуры, вы должны использовать BufferGeometry, который в последней версии three.js поддерживает все атрибуты, включая пользовательские (и это очень эффективно и быстро!). Затем вы должны предоставить атрибут смещения vec2 для каждой частицы: вы получите правильный UV из этого смещения и gl_PointCoord.

person Tapio    schedule 29.03.2013
comment
Спасибо, @Tapio, за быстрый ответ. У меня уже есть все частицы в BufferGeometry :) ... так что я могу сделать все это, просто используя BufferGeometry без необходимости использования вершинных и фрагментных шейдеров? - person Memo Lestas; 29.03.2013
comment
Нет, конечно, вам все еще нужны шейдеры, чтобы рисовать что-либо. Вам нужно передать шейдерам дополнительный атрибут, который сообщает, какую часть текстуры сэмплировать, т.е. uv, хотя, если вы хотите сопоставить несколько текселей с одной частицей, вам также нужно использовать gl_PointCoord, потому что у каждой частицы есть только одна вершина. (поэтому только один уф). - person Tapio; 29.03.2013
comment
Я собираюсь попробовать, однако, поскольку я новичок в программировании шейдеров, если вы знаете пример, который я могу использовать в качестве руководства, дайте мне знать, это будет потрясающе. большое спасибо @Tapio. - person Memo Lestas; 31.03.2013