2012-02-27 4 views
4

PowerVR SGX 하드웨어를 사용하여 ARM 장치의 텍스처에 오프 스크린 렌더링을 구현해야합니다.사용자 공간 메모리에 대한 OpenGL ES 렌더링

모든 것이 완료되었습니다 (픽셀 버퍼 및 OpenGL ES 2.0 API가 사용되었습니다). 해결되지 않은 유일한 문제는 매우 느립니다 glReadPixels 기능입니다.

저는 OpenGL ES의 전문가가 아니므로 커뮤니티에 묻습니다. 텍스처를 사용자 공간 메모리에 직접 렌더링 할 수 있습니까? 또는 텍스처의 메모리 영역에 대한 하드웨어 주소를 얻는 방법이있을 수 있습니까? 일부 다른 기술 (EGL 확장)?

PowerVR 하드웨어 용으로 만 작동하는 보편적 인 솔루션이 필요하지 않습니다.

업데이트 : '저속 기능 glReadPixels'에 대한 추가 정보

  • glReadPixels(0, 0, WIDTH, HEIGHT, GL_BGRA, GL_UNSIGNED_BYTE, &arr)
  • (24) MS ( GL_BGRA은 glReadPixels 표준되지는 PoverVR 확장이다),
  • memcpy(&arr, &arr2, WIDTH * HEIGHT * 4)
  • 걸리는 5 MS 소요

    • glReadPixels(0, 0, WIDTH, HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, &arr)210 밀리한다 : CPU의 메모리에 512 × 512 RGB 텍스처 데이터를 복사

      텍스처가 커질 경우 차이가 커집니다.

    +0

    클라이언트 공간 메모리에서 텍스처가 필요한 것이 무엇인지 물어볼 수 있습니까? 어쩌면 GPU 메모리를 떠나기 위해 텍스처가 필요하지 않을 수도 있습니다. 글쎄, 텍스쳐링을 위해 텍스처를 사용하고자 할 때 [FBOs] (http://www.songho.ca/opengl/gl_fbo.html)를 사용하여 GPU 텍스처로 직접 렌더링 할 수 있습니다. 너의 모든 문제는 쓸모 없어. –

    +0

    아니, 정말 필요해. 렌더링 된 이미지는 장치 작업의 결과로 네트워크를 통해 전송되어야합니다. – qehgt

    답변

    4

    해결되었습니다.

    사용자가 할당 된 메모리로 렌더링 OpenVR 하드웨어를 강제하는 방법을 방법 : 나는 빨리로 렌더링 된 이미지를 얻을 수 있습니다 https://gforge.ti.com/gf/project/gleslayer/

    을이 모든 후 : http://processors.wiki.ti.com/index.php/Render_to_Texture_with_OpenGL_ES#Pixmaps

    예는, 사용 방법 5 ms.

    +0

    qehgt 나는 이것을 통해 읽었습니다 ... CMem을 사용하여 사용자 공간 버퍼를 할당하고 EGLImageKHR을 사용하는 주요 트릭입니까? – Constantin

    +0

    CMEM - 예, EGLImageKHR - 확실하지 않습니다. CMEM 메모리에 "원시 픽스맵"을 할당해야합니다. 그러면이 픽스맵을 매우 빠르게 읽고 쓸 수 있습니다. 자세한 내용은 gleslayer 응용 프로그램의 sgxsink_main.cpp 파일에서'common_create_native_pixmap' 함수를보십시오. – qehgt

    +0

    네, 그게 제가 제 모범으로 사용하고있는 것과 정확히 같습니다. 당신을위한 마지막 간단한 질문입니다. 예제는 실제로 "읽기"에 대해서는 언급하지 않지만, cmem_alloc 주소 (lAddress, pvAddress는 아님)의 주소에있는 메모리에 액세스 할 수 있다고 가정합니다. 여기에서 우리는 단순히 우리가 원하는 곳에 memcpy합니까? – Constantin

    0

    opengl 함수를 호출하면 렌더링 대기열에 명령이 대기하게됩니다. 이러한 명령은 GPU에 의해 비동기 적으로 실행됩니다. glReadPixels를 호출하면 CPU가 렌더링을 마치기 위해 GPU를 기다려야합니다. 그래서 전화가 그 그림이 끝나기를 기다리고 있을지도 모릅니다. 대부분의 하드웨어 (적어도 내가 작업하는)에서, 메모리는 CPU와 GPU에 의해 공유되므로, 렌더링이 완료되면 읽기 픽셀이 너무 느려서는 안됩니다.

    당신이 결과를 기다리거나 다음 프레임으로 연기 할 수 있다면, 당신은 더 이상

    +1

    'glReadPixels' 전에'glFinish'를 호출 했으므로 문제가되지 않을 것이라고 확신합니다. 또한,이 시나리오에서는 이미지 렌더링,'glFinish' 호출,'glReadPixels' 호출 측정,'glReadPixels' 호출 측정,'glReadPixels' 호출 측정, ... 같은 값이 있습니다. 'glReadPixels'의 모든 호출은 느립니다. – qehgt

    0

    Frame buffer objects 당신이 찾고있는 무엇인가가 지연 표시되지 않을 수 있습니다. OpenGL ES 및 PowerVr-SGX에서 지원됩니다.

    EDIT : GPU/CPU 하드웨어는 CPU 쪽에서 GPU쪽으로 한 방향으로 데이터를 이동하는 데 엄청나게 최적화되어 있습니다. GPU에서 CPU 로의 백 패스는 대개 훨씬 느립니다 (하드웨어 리소스를 사용하기위한 우선 순위가 아닙니다). 그래서 당신이 사용하는 기술 (예 : FBO/getTexImage)은이 한계에 맞춰 실행됩니다.

    +0

    좋아, FBO로 렌더링 할 수 있습니다. 그러나 FBO에서 렌더링 된 이미지를 얻는 방법은 무엇입니까? 유일한 방법은'glReadPixels'를 호출하는 것입니다. 내가 잘못? – qehgt

    +0

    glReadPixels가 디스플레이에서 읽습니다. glGetTexImage를 사용하여 fbo에 색상 첨부 파일로 첨부 된 텍스처 데이터를 가져와야합니다. –

    +0

    @ MārtiņšMožeiko 슬프게도 OpenGL ES에는 glGetTexImage가 없습니다. –