2013-04-07 4 views
0

나는 내가 glUseProgramStagesOpenGL은 별도의 프로그램이

를 통해 존재에 매핑되는 단계에서 쉐이더를 포함해야합니다 파이프 라인 객체를 생성해야한다 이해 비교적 새로운 기능 GL_ARB_separate_program_object.What을 탐구하고 단이 나에 대해 생각하게

1. 여러 파이프 라인을 각 파이프 라인에 한 번 매핑 할 때 변형 Vertex/Fragment 셰이더 커플 (다른 셰이더 유형은 현재 사용하지 않음)을 사용하여 여러 파이프 라인 만들기.

하나의 파이프 라인을 2.Creating 런타임에 내가 performance.Which 옵션을 주로 걱정

glUseProgramStages 

현명 더 높은 성능이다 사용하여 다른 쉐이더로 매핑을 전환?

+0

둘 다 측정 했습니까? 또한 파이프 라인 객체는 상대적으로 값이 싸기 때문에 저장해야한다고 생각합니다. –

+0

오늘은이 시스템을 구현하여 성능 저하가 없음을 확인했습니다.하지만 빈번한 파이프 라인 개체 업데이트가 영향을 미치는지 확인해야합니다. –

답변

1

드라이버 구현 등으로 인해 귀하의 질문에 답변을 드릴 수 없습니다. 그러나 기능의 사실과 역사는 유익해야합니다.

EXT_separate_shader_objects가이 기능의 첫 번째 화신이었습니다. 가장 큰 차이점은 EXT 버전에서 사용자 정의 변수를 사용할 수 없다는 것입니다. gl_TexCoord과 같은 이전 호환성 입력/출력을 사용해야했습니다. 다음과 같이 이해할 수없는 감독을 정당화하기

Issue #2 in the EXT_separate_shader_objects specification 시도는 이것에 대한 이유를 설명 :

별도의 때문에 임의의 별도의 쉐이더에 대해 "이름으로 만남"을 지원하기 위해 시도하는 성능의 관점에서 바람직하지 않다 셰이더는 특별한 링크 단계없이 동일한 이름의 다양한 입력과 출력에 맞게 자연스럽게 컴파일되지 않습니다. 이러한 특별한 링크는 별도의 셰이더 바인딩에 추가 유효성 검사 오버 헤드를 유발합니다. 일관성있는 셰이더 세트에서 다른 셰이더로 전환 할 때 별도의 셰이더가 일치하지 않으므로 링크 자체는 glBegin 시간까지 지연되어야합니다. 이 특수 링크는 입력 및 출력 변동이 일치하지만 유형이 일치하지 않으면 오류 또는 정의되지 않은 동작을 생성합니다.

이는 이유는 무능력 외에, 일치하는 이름에 의존하지 않는 것이 제안 이었다 성능 관련 (당신이 말할 수없는 경우에, 나는 매우 높은 EXT_SSO의 생각하지 않는다). "이름으로 랑데뷰"의 성과는 한번 드로우 콜을 할 때마다 그려야 할 때부터해야합니다.

ARB_separate_shader_objects는 개체의 프로그램 모음을 캡슐화합니다. 따라서 개체는 "랑데부"데이터를 모두 저장할 수 있습니다. 첫 번째 그리기 호출은 느려질 수 있지만 새 프로그램을 연결하지 않는 한 동일한 PPO를 계속 사용하면 빠릅니다.

그래서 저는 PPO가 프로그램을 설정 한 다음 그대로 두어야한다는 증거로 받아 들였습니다. 일반적으로 가능한 경우 첨부 파일 객체 수정은 피해야합니다. 그렇기 때문에 FBO에서 텍스처/렌더 버퍼를 추가하거나 제거하지 않는 것이 좋습니다.

+1

간단한 단어로 말하면 "필요한만큼 많은 파이프 라인을 만들고 새 셰이더 조합이 필요할 때마다 파이프 라인을 변경하는 대신 전환하십시오." 평균? –