2016-07-09 7 views
2

첫 번째 게임 엔진에서 GPU 입자 시스템을 구현하려고합니다. 전에 CPU에 하나를 구현했지만 지금은 더 효율적으로 만들려고 노력하고 있습니다. 내 문제는 특히 평생 입자를 산란시키는 것입니다.스폰 GPU 입자

입자 엔진을위한 프레임 버퍼 텍스처를 사용하고 있기 때문에 매우 병렬 적이지만 CPU로 돌아갈 수없는 비용이 들지는 않습니까? 해당 입자 시스템에 대한 계산을 처리하는 쿼드를 그리는 데 첫 번째 단계가 있습니다 (정렬을 위해 두 번째 쿼드가 있어야 할 것입니다). 그런 다음 glDrawArraysInstanced를 실행합니다.

한 가지 생각은 부울 또는 int를 사용하여 입자를 생성해야 할 때, 입자를 만들 필요성 또는 스폰 할 입자의 양을 나타내며 둘 다 CPU에 의해 초기화됩니다. 그래서 한 개의 입자 (픽셀)가 발견되면 (첫 번째 fbo 텍스처의 알파 값이라고 가정 해 봅시다) 영 (0)보다 적습니다. 그리고 그것을 생성해야한다는 것을 알고 있습니다. 나머지 부분에 대해서는 생성을 어떻게 비활성화합니까? 파티클 수를 줄이거 나 버릴 파티클 수를 줄이십니까? 나는 변형 된 피드백 같은 것을 들었다. 그러나 그것이 최선의 방법인지는 모른다. 그리고 상태가없는 입자는 소리를 제한합니다. 모든 입자가 1 : 1의 산란율을 갖는 것은 아닙니다.

질문을 간단히 반복하려면 GPU 입자를 생성하는 가장 좋은 방법은 무엇입니까?

그래도 CPU에 입자 수가 많으면 glDrawArraysInstanced에서 그릴 양을 설정할 수 있으므로 답변에 포함시킬 수 있다면 감사 할 것입니다.

나는 이동을해야합니다
+2

"첫 번째 게임 엔진에서 작업 중"- [게임이 아닌 엔진 쓰기] (http://geometrian.com/programming/tutorials/write-games-not-engines/) –

+1

전에 게임. 다른 사람들의 엔진을 사용하는 것에 지쳐서 모든 게임에 대해 완전히 새로운 코드베이스를 작성하고 싶지는 않습니다. 저는 이미 렌더링, 물리학, 조명, 입력 및 기타 수많은 시스템에서 수 많은 작업을 수행했습니다. 멈추는 것은 지금 좋은 생각처럼 들리지 않습니다. –

+1

아, 그리고 @JesperJuhl - 방금 기사를 읽었습니다. 이미 여러 가지 게임 아이디어가 계획되어 있으며 코드의 모든 단일 시스템이 여러 유형의 게임에서 작동 할 예정입니다. 한 게임을 코딩하면 유연성이 떨어질 것입니다. 예를 들어, 필자의 입력 시스템은 Linux 및 Windows, 곧 Mac과 호환되며 사용하기 쉽고 유연한 다양한 입력 및 기능과 함께 작동하도록 설계되었습니다.힘든 사랑을 가져 주셔서 감사합니다.하지만 실제로 필요하지는 않습니다. 단지이 문제를 해결하기위한 최선의 (그리고 가장 유연한) 방법을 찾아야합니다. –

답변

0

...

는 CPU가와 '라이브'입자의 현재 수 (풀 크기가 될 것이다) 입자의 최대 개수가 무엇인지 알아야한다. 첫 번째 숫자는 입자 상태 VBO를 초기화하거나 크기를 조정하는 데 사용되며 자주 변경하면 안됩니다. 원하는 경우 프레임마다 프레임을 변경할 수 있습니다.

개별 입자 수명은 VBO 값의 일부로 저장되어야합니다. 아마도 카운터 나 시간 값을 사용하여 위치, 색상 등을 결정할 수 있으며이 카운터가 최대 값에 도달하면 입자를 '죽이고'다시 할당합니다. 초기 카운터 값을 변경하면 입자가 모두 동일하게 시작되고 업데이트 될 필요가 없습니다.

입자 상태를 업데이트하려면 예를 들어 변환 피드백을 원합니다. 구형의 각 입자에 대한 새 값을 계산하고이를 다른 VBO에 쓰는 '정점 셰이더 (vertex shader)'가 있습니다. 자세한 내용과 예제 코드는 OpenGL SuperBible을 참조하십시오. 두 개의 VBO 사이에 핑퐁 (ping-pong), 하나는 이전 값을위한 것이고 하나는 새로운 것에 대한 것이지만, 셰이더 내에서 작성할 수있는 큰 배열 (훨씬 더 큰 유니폼) 인 텍스처 버퍼 객체를 사용할 수도 있습니다. 매번 업데이트되는 입자의 수는 CPU 라이브 카운터에 의해 제어됩니다.

희망이 도움이됩니다.

+0

답변 해 주셔서 감사합니다. 그러나 VBO 사용을 고려하는 동안 이에 반대했습니다. 텍스처 (this http://nullprogram.com/blog/2014/06/29/)가 많은 수의 입자에 대해 더 나은 솔루션이라고 생각했습니다. 내 입자는 현재 루핑 수명을 가지고 있지만, 나는 그 입자를 조금씩 "죽을"수 있기를 바란다. 이것이 나의 문제점이다. GPU 하나에 정확히 하나의 새로운 입자를 만드는 방법을 모르겠습니다. –

+0

효율적인 병렬 처리를 원할 경우 개별 입자 제어를 고려하지 마십시오. 거대한 숫자에서 작동하는 알고리즘이 필요합니다. 개별 파티클은 glDrawArraysInstanced에서 사용되는 라이브 카운트를 줄이거 나 파티클이 음수 나이가되고 나이가 0보다 클 때 보이지 않게 할 수있게하여 조금만 죽을 수 있습니다. –

+0

내 계획은 내 계획입니다. 문제는 구현입니다. . 입자의 무작위 수명 때문에 gldrawarrayinstanced에 대해 살아있는 입자의 수를 제어하는 ​​것은 어려울 것입니다. GPU에서 증가하거나 감소하는 파티클 수가 있다면이 문제를 해결할 수 있습니다. –