2012-12-05 6 views
1

입자 시스템의 깊이 맵을 생성하려고하는데, MeshDepthMaterial을 사용하여 입자 시스템을 렌더링하면 모든 입자가 각 정점에 대해 단일 포인트로만 렌더링됩니다. 텍스처 매핑 된 입자가 전체 영역을 덮지는 않습니다.텍스처 맵을 사용하는 입자 시스템의 깊이 맵

깊이 맵을 생성하려면 MeshDepthMaterial을 사용해야합니까, 아니면 다른 옵션이 있습니까?

답변

4

지금 당장 MeshDepthMaterial을 ParticleSystem의 크기 나 텍스처를 존중하도록 만들 수있는 방법이 없습니다. 그러나이를 수행하는 사용자 정의 ShaderMaterial을 구현하는 것이 그리 어렵지 않습니다. 먼저 정점 셰이더와 조각 셰이더가 필요합니다.

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

정점 셰이더

프래그먼트 쉐이더는 텍스쳐 ( sampler2D map)를 얻어, 그 대신 칼라 값을 이용하는 단지 알파 수준 texColor.a 사용 완전히 표준이다. rgb의 경우 깊이를 기준으로 한 회색 음영 값이 사용됩니다 ( just like the MeshDepthMaterial). 가 필요한

여기
var material = new THREE.ShaderMaterial({ 
    uniforms : { 
     size : { type: 'f', value : 20.0 }, 
     near : { type: 'f', value : camera.near }, 
     far : { type: 'f', value : camera.far }, 
     map : { type: "t", value : THREE.ImageUtils.loadTexture(url) } 
    }, 
    attributes : {}, 
    vertexShader: vertShader, 
    fragmentShader: fragShader, 
    transparent: true 
    }); 

당신이 모든 정보와 쉐이더를 제공 한 : 카메라의 가까운 /까지 범위를 크기를 지금 당신은 너무 같은 THREE.ShaderMaterial를 HTML을 잡고 만드는 데 필요한이 쉐이더를 사용하는 입자와 텍스처를 매핑해야합니다.

jsFiddle demo of it here을 볼 수 있습니다.

+0

감사합니다. Paul. 훌륭한 응답. 실제로 쉐이더에서 사용 된 깊이 정보가 조각 쉐이더 (gl_FragCoord.z ​​/ gl_FragCoord.w)에서 사용 가능하다는 것을 알았다면 깊이 맵을 생성 할 필요조차 없었습니다. 전체 패스를 한 번에 수행 할 수있었습니다. – Someone