가장 올바른 대답은 프로그래밍 방법에 따라 다르지만 걱정할만한 것입니다. GPU가 엄청나게 빨라졌지만 GPU RAM과의 대역폭은 크지 않으며 가장 실망스러운 병목이 될 것입니다.
데이터가 한 번만 GPU 메모리로 전송되어 영원히 앉아 있습니까?
바라건대 요 렌더링 속도를 위해 매 프레임마다 데이터를 다시 보내지 않고 최대한 많은 데이터를 GPU에 저장하려고합니다. VBO는이 정확한 목적을 제공합니다. 정적 및 동적 VBO는 정적 모델에 가장 적합하고, VBO는 정점이 매 프레임마다 변경되는 모델 (예 : 파티클 시스템)에 가장 적합합니다. 그러나 동적 VBO의 경우에도 매 프레임마다 모든 정점을 다시 보내고 싶지는 않습니다. 변화하는 것만
건물의 경우 정점 데이터가 그대로 있고 행렬 (모델 / 세계, 투영 및 뷰) 만 변경됩니다.
파티클 시스템의 경우, 해당 시스템에 존재할 수있는 최대 파티클 수를 저장할만큼 충분한 동적 VBO를 만들었습니다. 각 프레임마다 해당 프레임에서 방출되는 파티클에 대한 데이터를 몇 개의 유니폼과 함께 보내면됩니다. 그릴 때 해당 VBO에서 시작점과 끝점을 지정할 수 있으므로 파티클 데이터를 삭제할 필요가 없습니다. 난 그냥 그리지 말라고 말할 수 있습니다.
모델이 실제로 각 프레임을 렌더링 할 때 GPU 프로세서는 GPU 메모리에서 매번 데이터를 가져와야합니까? 내가 의미하는 것은-두 번의 모델을 각각 여러 번 렌더링 한 경우-첫 번째 모델을 여러 번 렌더링 한 다음 두 번째 모델을 여러 번 렌더링하거나 첫 번째 모델을 한 번만 렌더링하면 두 번째 모델은 한 번만 렌더링하면 중요합니다. 계속 그렇게 인터리브?
하나 대신 여러 개의 드로우 콜을 보내는 행위는 훨씬 더 큰 한계입니다. 인스턴스화 된 렌더링을 확인하십시오. 도움이 많이되고이 질문에 대한 답을 쓸모 없게 만들 수 있습니다. 아직 해결하지 못한 드라이버 문제가 있었지만 작동시킬 수 있으면 문제가 해결되었습니다.
분명히 그래픽 카드는 RAM이 제한적입니다 .1 프레임을 렌더링하는 데 필요한 모든 모델 데이터를 보유 할 수없는 경우 각 프레임마다 CPU RAM에서 가져 오는 (일부) 메모리가 계속 맞습니까?
GPU RAM이 부족하지 않습니다. 그렇다면, 변경하지 않도록 변경하십시오. 매우 가설적인 시나리오에서 아마 어쩌면 충돌 할 것입니다. 그러나 나는 그것이 일어나는 것을 본 적이 없으므로 솔직히 알 수 없습니다.
한 가지 구별하는 것을 잊었습니다 .GPU로 데이터를 보내고 버퍼를 현재로 설정 / 바인딩합니다. 후자가 데이터 흐름을 유발합니까?
중요한 데이터 흐름은 없습니다. 약간의 비용이 들지만, 작성한 모든 코드 줄에 해당됩니다. 비용이 얼마나 드는지 알아 내면 프로파일 링이 무엇인지 다시 알 수 있습니다.
초기화를 통한 버퍼 생성
Raxvan의 답변은 좋지만 정확하지는 않습니다. OpenGL에서 버퍼를 만들면 공간이 예약 되지 않습니다 . 데이터를 전달하지 않고 공간을 예약하려면 glBufferData를 호출하고 null 만 전달하면됩니다. ( 여기 노트 섹션을 참조 하십시오 .)
버퍼 데이터 업데이트
glBufferData 또는 다른 기능을 의미한다고 생각합니까? 실제 데이터 전송이 이루어지는 곳입니다. (마지막 단락에서 말한 것처럼 null을 전달하지 않으면)
버퍼를 활성 상태로 바인딩 (다음 그리기 호출 에서이 버퍼를 렌더링하고 자체적으로 아무것도하지 않는다고 API에 알리는 방법입니까?)
예,하지만 그보다 조금 더 할 수 있습니다. 예를 들어, VAO (정점 배열 객체)를 바인딩 한 다음 VBO를 바인딩하면 해당 VBO가 VAO에 바인딩됩니다. 나중에 해당 VAO를 다시 바인딩하고 glDrawArrays를 호출하면 어떤 VBO를 그릴 지 알 수 있습니다.
많은 자습서를 통해 모든 VBO에 대해 VAO를 만들 수 있지만 이것이 의도 된 용도가 아니라는 말을 들었습니다. 하나의 VAO를 생성하고 동일한 속성을 가진 모든 VBO와 함께 사용해야합니다. 나는 이것을 아직 시도하지 않았으므로 그것이 더 나은지 아닌지를 확실히 말할 수는 없습니다.
API 드로우 콜
여기서 일어나는 일은 (우리의 관점에서) 매우 간단합니다. VAO를 바인딩하고 glDrawArrays를 호출한다고 가정 해보십시오. 시작점과 개수를 지정하면 해당 범위의 모든 정점에 대해 정점 셰이더가 실행되어 출력이 선 아래로 전달됩니다. 그러나이 모든 과정은 그 자체의 또 다른 에세이입니다.