파티클 시스템에서 독립적 인 투명성 주문


9

입자 시스템을 작성 중이며 입자를 정렬하지 않고 적절한 알파 블렌딩을 달성하는 트릭을 찾고 싶습니다.

  • 각 입자는 단일 메시의 점 스프라이트이며 장면 그래프 기능을 사용하여 투명 노드를 정렬 할 수 없습니다. 그러나 시스템 노드는 올바르게 정렬되어야합니다.
  • 입자 위치는 초기 속도, 가속 및 시간으로부터 쉐이더에서 계산됩니다. 시스템을 정렬하려면 CPU 에서이 모든 계산을 수행해야합니다. 이는 피하고 싶은 것입니다.
  • 카메라 위치를 기준으로 수백 개의 입자를 정렬하고 각 프레임 이음새를 GPU에 업로드하여 조용한 작동을 보장합니다.

알파 테스트는 GLES 2.0에서 충분히 빠르며 투명하지는 않지만 "마스크 된"텍스처에 적합합니다. 여전히 반투명 입자로는 충분하지 않습니다.

이것을 어떻게 처리하겠습니까?


그들이 올바르게 분류되는 것이 절대적으로 얼마나 중요합니까? 실제로 바닐라 블렌딩을 사용하는 (중요한) 인공물을 보셨습니까?
ChrisE

입자는 다른 입자 대신 배경과 혼합 될 수 있으며 점 스프라이트의 "직사각형"본질이 매우 두드러집니다. 알파 테스트는 여기에서 도움이되지만 알파 값이 조용하지만 조각을 버릴 정도로 충분하지 않은 경우에도 여전히 인공물이 눈에.니다.
Stepan Zastupov

6
파티클을 렌더링 할 때 비활성화 된 깊이 쓰기 (깊이 테스트 유지)를 시도 했습니까? 따라서 잘못된 주문이 덜 분명해집니다.
Adam

2
몇 가지 실험을 한 후에 깊이 쓰기를 비활성화하는 것이 대부분의 경우 가장 좋은 해결책이라는 것을 알았습니다.
Stepan Zastupov 2016 년

답변:


10

여기 내가 할 일이 있습니다.

1 단계 : 정렬하지 마십시오. 그냥 해. 문제인지 확인하십시오. 그렇지 않습니다.

2 단계 : 다음과 같이 실제로 정렬 할 필요가없는 것으로 입자를 제한합니다.

  • 딱딱한 것 (알파에서 커버리지까지 가능)

    • zbuffer가 정렬을 처리하게하십시오.
  • 부가적인 비트

    • a + b = b + a이므로 순서는 중요하지 않습니다

3 단계 : 더 많은 것이 필요한 경우 파티클 렌더링을 앞뒤에 비트로 분할하고 여러 번의 렌더링으로 렌더링을 수행합니다 (예 : 복잡한 연기를 수정할 수 있음)

4 단계 : 더 많은 것이 필요하거나 일반적인 솔루션이 필요한 경우 MRT를 사용하여 매우 거친 N 버킷 정렬을 수행하는 것이 좋습니다. 파티클을 N 개의 출력 표면으로 렌더링하고 별도의 패스로 구성합니다.

더 나아가면 특정 사용 사례에 대한 추가 정보가 필요합니다. 그러나 결국 주문 독립성이 필요하지 않을 것이라고 확신합니다. 무작위로 충분한 입자를 사용하면 괜찮을 것입니다 =)


6

파티클을 렌더링 할 때 깊이 버퍼에 쓰지 마십시오. 이렇게하면 모두 렌더링되고 서로 혼합 될 수 있습니다. 장면의 지오메트리에 의해 올바르게 차단 될 수 있도록 여전히 깊이 테스트를 수행해야합니다.


5

첨가제 혼합 순서를 사용하는 것은 중요하지 않습니다.

glEnable(GL_BLEND)
glDepthMask(GL_FALSE)
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
DrawParticles();

// Now turn depth masking on and blending off, so state is unchanged.
glDepthMask(GL_TRUE)
glDisable(GL_BLEND)

이것은 스프라이트 텍스처의 배경이 투명하다고 가정합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.