문제

나는 몇 가지 OpenGL 코드 동작하는 일에 걸쳐 다양 하드웨어입니다.나는 몇 가지는 코드:

  1. 생 버퍼로 렌더링과 결합 질감을의 컬러 버퍼(질감)
  2. 세이 버퍼로 렌더링 활성으로 조정하는 뷰포트,etc.
  3. 활성화 pixel shader(gaussian blur,이 예에서).
  4. 무 쿼드,전체 화면으로 질감에습니다.
  5. 바인딩을 해제합 renderbuffer,etc.

에서 개발 시스템이 잘 작동하고 있는 것입 의 효력을 흐리게 질감에서"장소"그러나 다른 하드웨어 이 보이지 않는 작동합니다.

했는데 그것은 아래 두 가지 방법이 가능합니다.

A)기 renderbuffer 렌더링하는 자체가 작동하도록되어 있지 않습니다,그리고 만 작품에서 개발 시스템으로 인해 일종의 fluke.

B)이 방법을 작동해야 하지만,다른 무언가 잘못된 것입니다.

어떤 아이디어가?솔직히 제가 힘든 시간을 찾는 사항에 대해 이 문제를 해결합니다.

도움이 되었습니까?

해결책

a) 정답입니다. 읽는 동안 동일한 버퍼로 렌더링하는 것은 정의되지 않습니다. 작동하지 않을 수도 있습니다. 정확히 무슨 일이 일어나고 있는지.

OpenGL의 경우 framebuffer_object 확장자 섹션은 "4.4.3 렌더링 렌더링 바운드 텍스처 객체의 이미지가 프레임 버퍼에 첨부 될 때 (기본적으로 정의되지 않은)를 알려줍니다. Direct3D9에서 디버그 런타임은 해당 설정을 사용하는 경우 큰 소리로 불만을 제기합니다 (그러나 하드웨어/드라이버에 따라 작동 할 수 있음). D3D10에서 런타임은 항상 대상으로 사용되는 대상을 풀지 않습니다.

이것이 정의되지 않은 이유는 무엇입니까? GPU가 너무 빠른 이유 중 하나는 많은 가정을 할 수 있기 때문입니다. 예를 들어, 픽셀을 가져 오는 장치는 픽셀을 작성하는 장치와 통신 할 필요가 없다고 가정 할 수 있습니다. 따라서 표면을 읽을 수 있고, n 사이클 후에 읽기가 완료되고, n 사이클 후에 픽셀 셰이더가 실행되고, GPU의 일부 출력 병합 버퍼에 넣고, 결국 어느 시점에서 메모리에 기록됩니다. 게다가 GPU는 "정의되지 않은"순서로 래스터 화됩니다 (하나의 GPU는 행으로 래스터링 할 수 있고, 일부 캐시 친화적 인 순서, 다른 하나는 완전히 다른 순서로) 표면의 어느 부분이 기록 될지 모릅니다. 먼저.

따라서해야 할 일은 여러 버퍼를 만드는 것입니다. Blur/Glow Case에서는 일반적으로 두 가지가 충분합니다. 첫 번째로 렌더링 한 다음 두 번째로 쓸 때 읽고 블러를 읽습니다. 필요한 경우 탁구 방식 으로이 과정을 반복하십시오.

다른 팁

일부 특별한 경우에는,심지어 backbuffer 충분할 수도 있습니다.당신은 단순히 하지 않 glClear,그리고 당신은 무엇을 그린 이전에 아직도있다.주의해야 할 점은,물론할 수 없습니다,당신이 정말에서 읽 backbuffer.하지만 같은 효과 페이딩 체크인/체크아웃,작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top