2013-06-07 5 views
0

우선 :
Windows XP SP3, 2GB RAM, Intel 코어 2 듀오 2.33GHz, nVidia 9600GT 1GB RAM. OpenGL 3.3이 완전히 업데이트되었습니다.OpenGL - FBO를 사용하여 루프에서 텍스처를 업데이트하는 중에 성능이 떨어지고 부정확 한 결과가 발생합니다.

내가하고있는 일에 대한 간단한 설명 :
이상적으로 glTexSubImage2D를 사용하여 GL 텍스처 (A)에 하나의 픽셀을 매 프레임마다 배치해야합니다.
그런 다음 shader-FBO-quadfacing 카메라 설정에서 텍스처를 수정하고 원본 이미지를 결과 FBO로 바꿉니다.

물론 FBO 피드백 루프를 원하지 않기 때문에 대신 수정 된 버전을 임시 텍스처 안에 넣고 glCopyTexSubImage2D를 사용하여 별도로 업데이트하십시오.

시퀀스

해주기이다

1) glTexSubImage2D 폭 높이 = = 1)와 함께 매 프레임 (GL 이용한 텍스처 (A)의 하나 개의 픽셀을 넣어.
2)이 수정 된 버전 A는 다른 텍스처 (B)로 렌더링되도록 쉐이더 -FBO-quad 설정 내에서 사용/수정됩니다.
3) 결과 텍스처 B는 glCopyTexSubImage2D를 사용하여 A 위로 덮어 씁니다.
4) 반복 ...

이 루프를 반복하면 쉐이더의 색상 값에 매 프레임마다 0.99를 곱하여 느린 페이딩 효과를 얻고 싶습니다.

2 가지가 잘못되었습니다 :
1) 프레임마다 반복되는 페이딩 인자 0.99로 페이딩은 RGB 48,48,48에서 멈 춥니 다. 따라서, 회색 픽셀의 흔적은 완전히 사라지지 않습니다.
2) 프로그램은 100FPS에서 실행됩니다. 아주 나쁜. 왜냐하면 glCopyTexSubImage2D를 주석 처리하면 프로그램이 1000FPS가됩니다 !!

glTexSubImage2D를 주석 처리하고 glCopyTexSubImage2D 만 남겨 두어 1000FPS를 달성합니다. 이 사실은 glTexSubImage2D와 glCopyTexSubImage2D가 병목 현상이 아니라는 것을 분명히하기 위해 (나는 glCopyTexSubImage2D를 2 차 FBO로 대체하여 동일한 결과를 얻으려고했다.)

관측 : 두 명령이 모두 작동하면 병목 현상이 나타납니다!

하드 모드 : PBOs 없음 pls. 소스와 EXE와

링크 :
http://www.mediafire.com/?ymu4v042a1aaha3

FPS 카운트 stdout.txt

내가 거기까지 노출 된 두 가지에 대한 해결을 요청

에 기록된다 (CodeBlocks 및 SDL 사용).
예상 결과 : 800-1000 FPS에서 완전 검정으로 전체 페이드 아웃 효과.

당신은 여기에 몇 가지 정밀 (양자화) 문제가 발생 : 문제 1로

+0

참고로, glTexSubImage2D의 많은 구현은 느립니다. 그래픽 파이프 라인을 중단하여 프로세스의 후반부에있는 데이터를 수정합니다. 나는 당신의 페이드 아웃을 달성하기 위해 다른 방법을 사용할 것을 강력하게 제안 할 것이다. –

+0

"* shader-FBO-quad setup *"그게 무슨 뜻입니까? 또한이 질문에는 정보가 부족합니다. 예를 들어,'glTexSubImage2D'로 텍스처를 수정한다고 해봅시다. 좋아요,하지만 어떻게 * 그렇게합니까? 이미지의 이미지 형식에 따라 빠른 방법과 느린 방법이 있기 때문입니다. 페이딩 팩터에 관해서 이야기하지만, 당신이 이것을 어떻게 적용하는지 명시하지는 않습니다. 우리는 더 많은 정보가 필요합니다. –

+0

Nicol, 다운로드 링크를 확인하십시오. 나는 코드 copypaste로 질문을 거듭 만들고 싶지 않았다. 페이드는 다음과 같이 적용됩니다 : 픽셀 쉐이더의 texture2D (..., ...). rgb * fadefactor. – user2464424

답변

0

문제 2 (B 읽는)로 렌더링 : 그래서 당신은 순서를 얻을 : 가능한 한 빨리 임의의 픽셀을 텍스처에 뿌려줍니다.
아마도 동적으로 메인 메모리에서 GPU 2 문제에 대한 해결책은 사소한 도착 후 정점 배열 또는 VBOs에 구성 데이터를 업로드 할 수있는 절대 빠른 방법 가입일 :
1) 정점 배열과 색상 배열
를 작성 (또는 인터리브 좌표를 색상, 성능/대역폭이 다를 수 있음).
2) Z 성분 = 0. 우리는 점들이 바닥에 놓이기를 원한다.
3) 정사영 투영을 사용하여 아래쪽을 가리키는 카메라
(화면 크기가 좌표 범위와 정확히 일치해야 함);
4) glPointSize = 1 및 GL_POINT_SMOOTH가 해제 된 GL_POINTS를 사용하여 FBO로 텍스처에 렌더링합니다.

꽤 표준입니다. 이제이 프로그램은 750fps로 실행됩니다. 충분히 닫으십시오. 내 꿈은 모두 "어이 엄마 봐! 나는 1000fps로 glTexSubImage2D를 돌리고있다!" 그 다음 meh.
glCopyTexSubImage2D가 매우 빠르지 만. 권하고 싶습니다.

퇴행을 GPU 가속하는 가장 좋은 방법인지 확실하지 않지만 결과가 주어지면 여기에 강한 힘이 집중되어야 함을 명심해야합니다. 어쨌든 페이딩 중지 중도 문제는 최소 상수 감소 변수를 설정하여 고정되므로 지수 곡선이 실패하더라도 페이딩은 아무리해도 끝납니다.

0

. 당신이 8 비트 UNORM 프레임 버퍼 포맷을 사용하고 있다고 가정합니다. 그래서 당신이 쓰는 모든 것은 256 단계 중에서 다음 이산 단계를 반올림합니다. 그것에 대해 생각해보십시오 : 48 * 0.99 = 47.52, 다시 48으로 끝날 것이므로 더 어두워지지는 않을 것입니다. 실제 부동 소수점 형식을 사용하는 것이 해결책 일 수 있지만 전체 성능을 크게 떨어 뜨릴 수 있습니다. ...

선택한 페이드 아웃 작업은 단순히 최선의 선택이 아니므로 일부 선형 항을 추가하는 것이 좋습니다. 적어도 1/255만큼 값을 줄 이도록 보장하십시오.

문제 2 : 실제로 병목 현상이 무엇인지 말할 수 없습니다. PBO를 사용하지 않으므로 동기 텍스처 업데이트로 제한됩니다.

그러나 왜 복사 작업을 수행해야합니까? 이런 종류의 표준 접근법은 텍스처/FBO/컬러 버퍼 "핑퐁 (ping-pong)"일 것입니다. 여기서 각 반복 후에 텍스처의 "역할"을 바꾸는 것입니다.

  • 가 B로 렌더링

    1. 갱신 (A 읽는)
    2. 업데이트 B
  • +0

    문제 1에 이상한 것은 GL_FLOAT를 사방에 놓고 픽셀 색상으로 0.0-1.0 수레가 있으면 문제가 여전히 지속되는 것처럼 보입니다 ...하지만 어쨌든 쉽게 처리 할 수 ​​있습니다. 문제 2. 복사 작업이 필요한 이유는 무엇입니까? 왜 탁구를하지 않는 것이 좋을까요? 왜냐하면 나는 잘하고있다. A가 B로 간 다음 B를 가져 와서 그대로 A에 복사하십시오. 또한 2 개의 FBO가있는 "적절한"핑퐁을 사용하면 속도가 떨어집니다! 이중 FBO 스위치보다 다소 빠르기 때문에 glCopyTexSubImage2D를 사용했습니다. – user2464424

    +0

    @ user2464424 : 무한 반복 횟수 후에 만 ​​지수 감소 함수가 0에 도달한다는 것을 알고 있어야합니다 (무제한의 정확도 가정). – derhass

    +0

    나는 완벽하게 잘하고있다.문제 1은 파기 거래가 아니며 문제 2에 집중해야합니다. – user2464424

    관련 문제