2013-08-21 6 views
1

나는 안드로이드 용 입자 필터 응용 프로그램을 쓰고 있습니다. 모든 입자가 GPU에 의해 병렬로 처리되기를 바랍니다.opegles 쉐이더에서 변수를 읽는 방법은 무엇입니까?

버텍스 셰이더의 코드를 사용하여 현재 위치를 기준으로 각 입자 또는 버텍스의 위치를 ​​업데이트하지만, 업데이트 된 위치를 OpenGLES에 다시 쓰거나 사용 가능하게 만드는 방법을 알 수 없습니다 다음 실행시 동일한 꼭지점을 처리하는 셰이더

속성 변수는 적절한 범위를 갖지만 버텍스 쉐이더에서만 읽습니다.

균일 한 변수가 적절한 범위를 갖지만 배열을 수행 할 수 없습니다 (많은 수의 정점에 대해 유니폼을 구현하기가 어렵습니다). 그리고 다시 버텍스 쉐이더에서만 읽을 수 있습니다.

가변 변수에는 수정이 가능한 범위가 있지만 프로그램 내 조각 쉐이더에서만 볼 수 있습니다. 조각 쉐이더가 정보를 OpenGLES에 쓸 수 있다면 어떤 것이 효과가있을 수 있습니다. Fragment Shaders가 attibute 변수를 수정할 수 있습니까 (다음 실행시)?

조각 쉐이더가 변수를 업데이트하는 방법이 있습니까? {attribute, uniform, varying, default, other} 또는 디스플레이가 아닌 메모리에 버퍼를 쓸 수 있습니까?

답변

3

완전히 잘못된 방식으로 쉐이더에 대해 생각하고 있습니다. 그들은 입력 (예 : 속성, 유니폼, 샘플링 된 텍스처)을 사용하여 일부 계산을 수행 한 다음 렌더링 파이프 라인의 다음 단계에서 출력합니다.

유니폼에 쓸 수 없습니다. 아무런 의미가 없기 때문입니다. 수십 또는 수천 개의 셰이더 인스턴스가 동시에 실행되며 각 셰이더는 동일한 유니폼 세트를 사용합니다.

그렇다면 FBO를 사용하는 경우 입니까?라고 말하면 텍스처 첨부 파일에 쓰는 것입니다. 지능적으로 수행하는 경우 정점 셰이더에서이 텍스처의 값을 검색하여 입자의 새 위치를 결정할 수 있습니다. 어떤 텍셀이 어떤 입자에 해당하는지, 3 또는 4 채널 텍셀에 속성을 패킹하는 방법 등을 다루는 계획을 세워야 할 것입니다.하지만 GPU 기반 파티클 시스템이 사전 Compute Shader로 구현되는 방법이 있습니다.

또는 변형 피드백을 사용할 수 있습니다. OpenGL ES가 이것을 지원하는지 확신 할 수 없습니까?

이 방법을 사용하면 입자 위치, 색 등의 모든 계산이 특수 조각 셰이더 패스로 연기된다는 것을 지적해야합니다. 파티클 버텍스 쉐이더는 기본적으로 이전의 프래그먼트 쉐이더 패스의 결과를 사용하는 텍스처 룩업 (버텍스가 사용해야하는 위치, 색상 등을 설정하기 위해 사용)보다 조금 더 많습니다. Google을 살펴보면 관련 튜토리얼 및 기술 데모가 있습니다. 어쨌든 이것은 계산 쉐이더 나 피드백을 갖지 않기 때문에 임베디드 하드웨어의 GPU에서 100 % 수행 할 수있는 유일한 방법입니다.

+0

OpenGL ES 3.0은 변환 피드백을 지원합니다. 불행히도 저는 아직도 2.0입니다. 제안이 효과가있는 것처럼 들리지만 예제에 대한 링크가 도움이됩니다. 나는 내가 무엇을 찾을 지 안다는 것을 이제 알게 될 것입니다. – izzy