많은 메쉬를 한 번에 렌더링하는 방법을 찾고 있으므로 각 메쉬에 그리기 호출을 할 필요가 없습니다. 저는 여기서 2D 렌더링을 다루고 있습니다. 사각형과 같은 전형적인 객체는 두 개의 삼각형을 가질 수 있습니다. 그러나 객체는 상당히 복잡하고 수천 개의 삼각형을 가질 수도 있습니다.OpenGL - 한 번에 개별 변형을 사용하여 여러 메쉬 렌더링
이제 각 개체는 그 자체로 이동할 수 있습니다. 개념적으로 각 "객체"에 대해 VBO (또는 VBO/IBO 쌍)를 사용하는 것이 합리적입니다. 객체가 변경되지 않는 한 각 프레임에 GPU에 업로드해야하는 모든 것은 변환 정보입니다. 위치 벡터 및 방향 값. 또는 이와 동등한 변형 행렬.
그러나이 접근법의 문제점은 초기화 할 1000 개의 VBO 및 1000 개의 IBO가있는 1000 개의 정사각형 개체의 장면과 2000 개의 삼각형을 렌더링하기 위해 각 프레임의 1000 세트의 유니폼을 1000 개의 그리기 호출로 설정하는 것입니다.
오케이. 이러한 모든 객체가 동일하면 하나의 VBO/IBO를 사용하여 유니폼 버퍼 객체를 설정하거나 유니폼 버퍼 객체를 설정하십시오 (또는 유니폼 배열이 더 적절합니다 -이 객체를 사용하는 방법을 알아야합니다). 그 각각에 대해 하나의 인스턴스 그리기 호출을 실행하여 버텍스 쉐이더가 인스턴스 번호를 사용하여 변환 데이터를 UBO에서 가져 오게합니다. 큰.
한 단계 더 나아가고 싶습니다. 난 동일하지 않은 메쉬에 인스턴스화하는 양을하고 싶습니다 : 저는 1000 개의 서로 다른 오브젝트를 가지고 있습니다. 1000 개의 별도의 버텍스/인덱스 버퍼 쌍 또는 하나의 거대한 버텍스/인덱스 버퍼 쌍으로 설명하게되어 기쁩니다. 한 번의 호출로 GPU로 tranformation 데이터를 보내고 싶습니다. 드라이버/GPU가 올바른 버텍스를 바인딩하거나 선택하게하는 것은 간단합니다.
이 작업을 수행 할 수 있습니까? SM4 형상 쉐이더를 사용하지 않고도이 작업을 수행 할 수 있습니까?
업데이트 : 나는 이것을 달성 할 수있는 잠재적 인 방법을 생각했습니다. 나는 꼭지점 속성을 변환을 포함하는 UBO에 색인을 붙일 "인스 턴싱"값으로 사용합니다. 이것을하는 방법입니까?
이것은 조기 최적화의 냄새가납니다. 무엇이 당신이 이것을 * 필요로한다고 생각하게합니까?이 "1000 개체"를 정상적인 방법으로 렌더링 할 수는 없습니까? –
아마도 그럴 필요는 없습니다. 그러나 나는 나의 목적을 위해 최선의 방법으로이 기술을 사용하는 법을 배우는 것에 관심이있다. 매우 많은 수의 객체를 가질 수 있기를 원합니다. 한 번의 호출로 모든 객체를 그릴 수 있다면 함수 호출 오버 헤드를 피하는 것 이상의 이점을 얻습니다. 또한 뷰포트 컬링을 얻습니다. , 무료로. –
어떻게하면 뷰포트 도태가 가능합니까? 인스 턴싱은 아무 것도하지 않습니다. 그것은 할 수 없다. 실제로 인스 턴싱의 요점은 CPU 오버 헤드를 줄이는 것이므로 가능한 한 인스턴스 당 처리량을 최소화하려고합니다. 빠른 절두체 컬링 (culling)조차도 피해야합니다. –