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

标签 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>

最佳答案

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

关于three.js - 为什么带着色器的粒子系统不起作用?三.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15697898/

相关文章:

android - OpenGL ES 3.0/GLSL 不呈现数据 (Kotlin)

opengl-es - OpenGL ES 中的标识符、初始化和局部变量

javascript - JavaScript 中的高效粒子系统? (WebGL)

algorithm - Haskell 粒子模拟 - 计算粒子的速度

javascript - 旋转相机面对物体,而不会弄乱经纬度值

javascript - Three.js - 如何检查对象是否对相机可见

animation - 如何使用Three.js更改CubeGeometry的宽度?

three.js - 使用Three.js翻转(镜像)任何对象

opengl - 附加了分割着色器时,glDrawArrays失败

c - 从C中的缓冲区分配