2017-03-01 2 views
1

저는 장면에서 정의하고있는 클리핑 평면을 고려한 셰이더를 만들려고합니다. 이러한 클리핑 평면은 내가 사용하고있는 '바닐라'모든 자료에 잘 적용됩니다. THREE.MeshLambertMaterial, THREE.MeshPhongMaterialTHREE.MeshPhysicalMaterial이지만 THREE.ShaderMaterial에는이 구현이 없습니다. 이 개 큐브, THREE.MeshStandardMaterialTHREE.ShaderMaterial에 의해 정의 된 재료 하나 하나가이 예에서 https://jsfiddle.net/fraguada/27LrLsv5/THREE.ShaderMaterial에 클리핑 추가

이 무슨 뜻인지의 예입니다. THREE.MeshStandardMaterial 클립이 포함 된 큐브가 정상입니다. THREE.ShaderMaterial이있는 큐브가 잘리지 않습니다.

(필자는 jsfiddle에 표시 나는 일반적으로 대신 나는이 유사한 방식으로 그들을 정의하고있어, 스크립트 태그 버텍스/픽셀 쉐이더를 정의하고 있지 않다 :. https://github.com/mrdoob/three.js/blob/dev/examples/js/shaders/BasicShader.js를)

그래서, 몇 질문 :

  1. THREE.ShaderMaterial에 클리핑 평면이 포함되어 있어야합니까? (클리핑 속성이 있지만 가능한 기능이 확실하지 않습니다.)
  2. 그렇지 않은 경우 클리핑을 활성화하는 데 필요한 params 및 shader 청크를 포함하도록이 셰이더를 어떻게 수정할 수 있습니까?

답변

3

사실, 클리핑은 Three.js를 쉐이더 내부에서 수행된다.

그 4 "쉐이더 덩어리" 추가하여 당신이 당신의 쉐이더 내부를 처리 할 수 ​​있고, 그것이 작동되도록하려면 다음을 수행하십시오 버텍스 쉐이더의 상단에

쉐이더에 #include <(chunk name)>을 추가하기 만하면 해당 청크에 액세스 할 수 있습니다.

그런 다음 material.clipping = true;을 설정하면 제대로 작동합니다.

확인하십시오. fiddle


참고

, 셰이더 작업을하려면 나는 또한 begin_vertex.glslproject_vertex.glsl을 추가했다.

내가 현재 phong shader implementation을 확인하여 그 청크를 어디에 넣어야하는지 파악했습니다.


주 2

이 코드는 문자열 배열로 구현 된 쉐이더와 함께 작동하지만 당신은 또한 THREE.ShaderChunk[(chunk name)]와 쉐이더 덩어리를 참조 할 수 있음을 유의하십시오.
귀하의 경우에 더 적합해야합니다.

+0

고마워요. @neeh, 이것은 내게 약간의 열매가되었습니다. begin_vertex 및 project_vertex 청크가 없습니다. 나는'mvPosition'과 관련된 오류를 계속 지었지만 정의한 덩어리에 대해서는 0이 아니 었습니다. 다시 한 번 감사드립니다! –

+0

감사합니다 !! 이 대답의 가장 중요한 부분은 설정해야 할 속성이 ShaderMaterial에 대해 '클리핑 (clipping)'이라는 것입니다. 다른 재질에는 없습니다. https://threejs.org/docs/#api/materials/ShaderMaterial – taseenb