Map 使用纹理贴图的粒子系统深度贴图

Map 使用纹理贴图的粒子系统深度贴图,map,system,three.js,depth,particles,Map,System,Three.js,Depth,Particles,我试图为粒子系统生成深度贴图,但如果我使用MeshDepthMaterial渲染粒子系统,则每个粒子仅渲染为每个顶点的单个点,而不覆盖纹理贴图粒子显示的整个区域 我是否需要使用MeshDepthMaterial生成深度贴图,或者是否有其他选项?目前无法获取MeshDepthMaterial以反映粒子系统的大小或纹理。但是,实现一个自定义着色器材质并不是太难。首先,需要顶点着色器和片段着色器 <script type="x-shader/x-vertex" id="vertexShader"

我试图为粒子系统生成深度贴图,但如果我使用MeshDepthMaterial渲染粒子系统,则每个粒子仅渲染为每个顶点的单个点,而不覆盖纹理贴图粒子显示的整个区域


我是否需要使用MeshDepthMaterial生成深度贴图,或者是否有其他选项?

目前无法获取MeshDepthMaterial以反映粒子系统的大小或纹理。但是,实现一个自定义着色器材质并不是太难。首先,需要顶点着色器和片段着色器

<script type="x-shader/x-vertex" id="vertexShader">
  uniform float size;
  void main() {
    gl_PointSize = size;
    gl_Position = projectionMatrix * modelViewMatrix * vec4( position , 1.0 ); 
  }
</script>

<script type = "x-shader/x-fragment" id="fragmentShader">
  uniform sampler2D map;
  uniform float near;
  uniform float far;

  void main() {
    float depth = gl_FragCoord.z / gl_FragCoord.w;
    float depthColor = 1.0 - smoothstep( near, far, depth );

    vec4 texColor = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) );
    gl_FragColor = vec4( vec3(depthColor), texColor.a);
  }
</script>
在这里,您已经为着色器提供了它所需的所有信息:摄影机的近/远范围、粒子的大小以及它需要映射的纹理


您可以看到一个。

现在无法获得网格深度材质来考虑粒子系统的大小或纹理。但是,实现一个自定义着色器材质并不是太难。首先,需要顶点着色器和片段着色器

<script type="x-shader/x-vertex" id="vertexShader">
  uniform float size;
  void main() {
    gl_PointSize = size;
    gl_Position = projectionMatrix * modelViewMatrix * vec4( position , 1.0 ); 
  }
</script>

<script type = "x-shader/x-fragment" id="fragmentShader">
  uniform sampler2D map;
  uniform float near;
  uniform float far;

  void main() {
    float depth = gl_FragCoord.z / gl_FragCoord.w;
    float depthColor = 1.0 - smoothstep( near, far, depth );

    vec4 texColor = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) );
    gl_FragColor = vec4( vec3(depthColor), texColor.a);
  }
</script>
在这里,您已经为着色器提供了它所需的所有信息:摄影机的近/远范围、粒子的大小以及它需要映射的纹理


你可以看到一个。

谢谢你,保罗。反应很好。事实上,我甚至不需要生成深度贴图,一旦我发现着色器中使用的深度信息在片段着色器gl_FragCoord.z/gl_FragCoord.w中可用,我就可以在一个过程中完成整个效果。谢谢,Paul。反应很好。实际上,我甚至不需要生成深度贴图,一旦我发现着色器中使用的深度信息在片段着色器gl_FragCoord.z/gl_FragCoord.w中可用,我就可以在一个过程中完成整个效果。