2013-10-14 5 views
2

여러 개의 셰이더가 관련된 RenderToTexture 컨텍스트에서 최종 렌더 대상 중 하나에 CPU 액세스가 필요합니다. glGetTexImage을 사용하면 불행히도 모든 텍스처 데이터가 클라이언트 메모리에 복사됩니다. 이 복사본을 방지하기 위해RTT to TEXTURE_BUFFER

, 나는 렌더링의 일환으로 그 질감을 사용하여, 따라서 텍스처에 별도의 버퍼 개체를 연결하는 TEXTURE_BUFFER를 사용하여 RTT를 implemnet 위해 노력하고 단순히 텍스처의 매핑 할 glMapBuffer를 사용하고 데이터 저장소에 저장하고 CPU에 액세스 가능하게합니다.

코드를 제외하고 나는 그러한 전략이 옳은지 (내 마음을 잘 넘어서는 것은 아님) 또는 어떤 사양에 어긋나는 지 물어보고 싶습니다.

텍스처를 설정하는 방법으로 TBO 관련 문서가 많지만 RTT 결과를 읽는 데 TBO를 사용하는 것과 관련해서는 아무 것도 없습니다. 나는 내가하려는 일이 어떤 방식 으로든 합법적이지 않은지 궁금해하고 있습니다.

+0

왜 시스템 메모리에 콘텐츠를 다운로드해야합니까? 어쩌면 당신은 GPU에서 작업을 할 수 있을까요? 매핑 버퍼는 일반적으로 복사본을 만듭니다. https://www.opengl.org/wiki/Buffer_Object#Mapping – fen

+0

실제로 시스템 메모리로 복사하는 것을 피하려고합니다. 버퍼 객체 매핑은 복사가 필요없는 경우에 종종 해결됩니다. 아니요, GPU에서 작업 할 수 없습니다. – user815129

+0

픽셀 버퍼 객체를 살펴볼 수도 있습니다. http://www.songho.ca/opengl/gl_pbo.html, https://www.opengl.org/wiki/Pixel_Buffer_Object – fen

답변

1

이 방법은 효과가 없습니다. A buffer texture은 실제로는 this related question/answer pair에 설명 된 것처럼 렌더링 대상 또는 2D 텍스처 필터링에 사용할 수있는 2D 텍스처가 아닙니다. 실제로는 셰이더가 선형 1D 정수 인덱스 배열 (특수한 종류의 질감으로 위장한)이라는 셰이더에 액세스 할 수있는 버퍼의 데이터이므로 일반적인 필터링 된 2D 텍스처와는별로 관련이 없습니다. OpenGL 4가 나중에 shader storage buffer으로 도입 한 것과 훨씬 비슷하지만 (GL 3 하드웨어에서는 아직 사용하기가 더 편하고 읽기 전용이지만) uniform buffer object (크기는 더 크고 다른 메모리 영역을 사용함) . 따라서 FBO에서는 렌더링 대상으로 TBO를 사용할 수 없습니다.

귀하가 선택할 수있는 것은 pixel buffer object (PBO)입니다. 여전히 텍스처 메모리에서 추가 버퍼로 복사본이 포함되지만, 바로 사용된다면 비동기 읽기, 특수한 호스트 액세스 가능 메모리 및 이와 유사한 것들로부터 이익을 얻을 수 있습니다.

+0

고마워. 심층적으로 고려한 결과, Fen이 처음 제안한 PBO와 비동기 작업을 최대화하기 위해 렌더링 파이프 라인을 수정하기로 결정했습니다. – user815129