2017-12-23 78 views
1

OpenGL 응용 프로그램을 평소보다 높은 해상도로 렌더링하려고합니다. 관련 GLX/OpenGL 기능의 대부분을 연결하는 공유 라이브러리를 이미 만들었습니다. 현재 접근 방식은 다음과 같습니다 (상위 수준).OpenGL Hooking - 임의 크기의 FBO 렌더링

When my hooked SwapBuffers() is called 
    Unbind my FBO 
    Call the (original/unhooked) SwapBuffers() 
    Bind my FBO 
    Set the viewport to (0, 0, HIGH_RES_X, HIGH_RES_Y) 
    Set the scissor region to (0, 0, HIGH_RES_X, HIGH_RES_Y) 
    return 

이 방법은 (대부분의) 응용 프로그램에서는 작동하지 않습니다. 일부 응용 프로그램은 glFragCoord.xy을 화면 해상도를 나타내는 유니폼 (화면 공간에서 텍스처 좌표로 변환)으로 나눠서 (스크린 공간 작업의 경우) 텍스처 조회를 수행하기 때문에 그런 것 같습니다.

출력 크기를 조정할 수없는 경우 glReadPixels을 사용하지 않고 기본 프레임 버퍼 (예 : 색상 및 깊이 버퍼)에 그려지는 내용을 가져올 수 있는지 궁금합니다. 이상적으로 텍스처의 형태로이 데이터에 액세스하는 방법이있을 것입니다 (이미 GPU에 있습니다). Pixel Buffer Objects에 관한 것들을 들었습니다.이 중 하나를 사용하면 파이프 라인 실속을 방지 할 수 있습니까?

+2

이 방법은 자체 프레임 버퍼를 렌더링하는 모든 응용 프로그램에 대해서는 작동하지 않습니다. 그들은 모든 프레임을 묶어서 뷰포트와 그 밖의 모든 것을 적합하게 설정해야합니다. –

+0

내 원래 접근 방식은 glBindFramebuffer (gl_FrameBuffer (GL_FRAMEBUFFER, 0)에 대한 호출을 대체하여 내 프레임 버퍼를 바인드하도록 glBindFramebuffer를 연결했습니다. 다른 glBindFramebuffer 호출은 영향을받지 않습니다. 나는 또한 다른 FBO가 묶이지 않는다고 가정하고 렌더링 해상도가 항상 내가 원하는 것임을 확인하기 위해 glViewport를 연결합니다. – AnimatedRNG

+1

그것도 고장났습니다. 기본 프레임 버퍼는 일반적인 FBO처럼 동작하지 않습니다. 예를 들어,'glDrawBuffers' 열거자는 완전히 다릅니다. –

답변

1

내가 제안한 기술은 실제로 소수의 응용 프로그램에서만 작동하지만 대부분의 경우에는 작동하지 않습니다.

색상/깊이 버퍼를 추출하려는 경우 glReadPixels와 함께 PBO 풀을 사용하거나 glBlitFramebuffer를 사용할 수 있습니다. 전자는 대기 시간이 문제라면 선택 사항이 아닙니다. 후자는 꽤 잘 작동합니다 (reshade 프로젝트의 example 참조)