2012-04-25 1 views
0

필자가 쓰고있는 iOS 앱의 Spherical Harmonics 쉐이더 프로젝트를 시작합니다. 나는이 주제에 대한이 훌륭한 논문을 읽음으로써 시작했다. (PDF) - http://bit.ly/aQmax3.iOS GLSL 구면 고조파 쉐이더. iOS GPU를 사용하여 레이 캐스트하는 방법

이 논문은 레이 캐스팅을 포함하는 장면 전처리 단계를 설명합니다. 누군가가 iOS에서 GLSL을 사용하여 레이 캐스팅을 수행하는 방법을 설명 할 수 있습니까?

답변

2

주변 광선에 의해 어떤 표면이 닿았는지를 결정하는 과정에서 사용되는 레이 캐스팅을 언급하는 경우 (주변 폐색 음영의 경우), 나는 Molecules iOS 응용 프로그램 내에서이를 수행했습니다. 나는 this blog postthis paper에서 나노 기술 컨퍼런스를 위해 제출 한 내용에 대해 조금 이야기하지만, 그 내용을 확장 할 수 있습니다.

필자는 필자가 깊이 테스트를 사용하여 다양한 방향에서 주변 조명에 의해 표면에 부딪히는 영역을 결정합니다. 나는 내 모델을 가지고 그것을 둘러싼 구체의 균일하게 분산 된 점 집합에서 그것을 보는 누군가에 해당하는 일련의 방향으로 렌더링한다. 오브젝트 표면의 각 점에 대해, 그 점에서 보이는 표면에 대해 계산 된 깊이에 대해 변형 된 Z 위치를 테스트하여 해당 점이 해당 방향에서 볼 수 있는지 여부를 결정합니다.

나는 앰비언트 오 클루 전 강도 텍스처를 사용하여 객체의 여러 방향에서이 가시성을 추적합니다. 커스텀 쉐이더를 사용하여이 텍스처의 위치와 내 물체 표면의 위치 사이를 매핑합니다. 해당 위치에서 회전이 보이면 회색 값 (1/(배향 수))을 쓰고 숨겨진 경우 검정색으로 씁니다. 그런 다음 추가 광선 혼합 모드를 사용하여 주변 광선에 의해 어느 표면이 가장 많이 맞았는지 확인하기 위해이 값을 누적합니다.

내 주변 폐색 질감과 같을 다음이 경우 Ambient occlusion texture

, 나는 분자 모델의 한 부분으로 구 일련의 매핑, 그래서 그 질감의 각 사각형은 표면이다 구체의 영역. 매핑 기능을 사용하여 병합됩니다. 실제 모델 감싸 때,이 값은 다음과 같이 :

Mapped ambient occlusion values

또한

, 다양한 방향에서 내 객체의 깊이 값을 결정하기 위해, 내가 픽셀 당 계산 내 자신의 깊이 쓰기 기능을 만들어야했습니다 깊이 값을 저장하고 사용자 지정 깊이 텍스처에 저장합니다. 그런 다음 주변 광선이 방향의 한 점에 도달하는지 여부를 결정할 때이 텍스처를 읽습니다. 올바르게 기억하면 iOS 기기에서 직접 깊이 버퍼에서 읽을 수 없으므로 모델에도 비슷한 작업을 수행해야 할 수 있습니다.

이것은 반사 된 확산 조명 케이스를 다루지는 않지만, 적어도 내 주변의 차광 쉐이딩을 수행 한 방법을 설명합니다. 이 응용 프로그램의 소스 코드는 위의 링크에서 찾아 볼 수 있습니다. 실제로이 모든 내용이 실제로 어떻게 작동하는지 확인할 수 있습니다.

+0

우와. 매우 인상적. 이 브래드 주셔서 감사합니다. 나는 종이를 파헤쳐 볼 것이고 나는 더 이상의 질문을 할 것이다. 건배. – dugla

+0

브래드 (Brad), 앰비언트 오 클루 전 패스와 관련. 각 구형 원자의 화면 공간 경계 상자에 해당하는 정사각형 스크린 정렬 된 카드를 사용하는 것이 맞습니까? 구면 법선을 사각형에 매핑 한 다음 각 구 위의 반구를 통해 "광선 - 캐스트"를 수행합니다. 위의 분자에 대해 얼마나 걸리나요? 이것이 마치 3D 다각형 메쉬에서도 작동하는 것처럼 들립니다. – dugla

+0

계산 모델의 분야와 실린더의 수에 의존하지만, 상기 모델은 아이폰 4에 전체 주위 흡장 패스를 렌더링 ~ 2 초 정도 (매우 빨리 4S, 아이 패드 2, 3), (22)로 구성되는 다른 방향. 단일 방향은이 특정 셰이더를 실행하는 데 약 1/10 초가 걸립니다. 이것이 어떻게 다른 객체 유형으로 확장 될 수 있는지를 알 수 있었지만, 사용하는 특정 셰이더는 이러한 구체와 실린더 사기꾼에게 맞춰져 있습니다. –