2011-01-23 4 views
2

다중 패스 렌더링 시스템을 사용하여 OpenGL에서 큐브 맵을 동적으로 생성하려고합니다. 내가 사용하고있는 메서드는 glReadPixels로 테스트 한 프레임 버퍼 객체에 장면을 성공적으로 렌더링합니다. 프레임 버퍼는 텍스처가 GL_TEXTURE_CUBE_MAP_ARB 인 대상에 첨부됩니다. 프레임 버퍼 내용이 일 때이 glGetTexImage로 바운드 텍스처를 쿼리하고 내용을 디스크에 쓰는 것으로 끝났음을 확인했습니다.프레임 버퍼 객체가있는 OpenGL의 동적 큐브 맵 렌더링

그러나 개체에 렌더링하기 위해 큐브 맵을 바인딩하면 텍스처가 메시에 표시되지 않습니다. 다음

프로세스는 : ​​

1))

2 GL_TEXTURE_CUBE_MAP_ARB

모든 텍스처 바인딩을 해제 프레임 버퍼 객체를 결합한다.

3) 텍스처를 프레임 버퍼의 대상 GL_COLOR_ATTACHMENT0_EXT에 첨부합니다. 큐브의 양수 x 쪽부터 시작합니다 (GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB). 다른 사람들은 다음 패스를 따른다.

4) 프레임 버퍼의 대상 GL_DEPTH_ATTACHMENT_EXT에 깊이 렌더링 버퍼를 연결합니다.

5) glDrawBuffer를 사용하여 GL_COLOR_ATTACHMENT0_EXT로 직접 렌더링.

6) 해당 축을 따라 장면을 렌더링하십시오.

7) 프레임 버퍼가 여전히 바인딩 된 상태에서 glFramebufferTexture2DEXT로 텍스처를 분리합니다.

8) 프레임 버퍼를 바인딩 해제하고 glDrawBuffer를 사용하여 렌더링을 GL_BACK로 리디렉션합니다.

9) 큐브 맵의 모든면에 대해 1-8 단계를 반복합니다.

10) 최종 큐브 맵 텍스처를 바인딩하고 최종 장면을 렌더링합니다. GLSL 셰이더는 텍스처 좌표를 계산하는 데 사용됩니다.

이 기술은 사용 가능한 노트를 기반으로합니다. here. 이렇게까지 촬영

디버깅 단계 :

I)는 쉐이더를 테스트하기 위해 디스크에서 정적 큐브 맵을로드. 그것은 예상대로 작동합니다.

II) 처음 6 회의 패스 중에 glReadPixels를 사용하여 프레임 버퍼의 내용을 쿼리했습니다. 그 장면은 꼭해야만했다.

III) 렌더링 완료 후 glGetTexImage를 사용하여 큐브 맵의 내용을 복사했습니다. 내용을 디스크에 이미지 파일로 씁니다. 입방체의 여러면이 있어야합니다.

프레임 버퍼/텍스처가 올바르게 렌더링되었다고 결론 지을 수 있습니다. 어떤 이유로 든 결과 메쉬가 최종 메쉬에 나타나지 않습니다. 텍스처는 최종 렌더링 단계 이전에 명확하게 바인딩되어 있으며 GL_TEXTURE_CUBE_MAP_ARB가 활성화되어 있습니다.

위에서 설명한 절차에서 언급했듯이 텍스처는 읽기/쓰기 충돌을 피하기 위해 프레임 버퍼 렌더링 전에 언 바운드입니다. 유사하게, 텍스쳐는 동일한 이유로 각각의 패스 후에 프레임 버퍼로부터 분리된다.

처음에는 GL_COLOR_ATTACHMENT0_EXT를 다시 사용하여 문제가 발생했다고 우려했습니다. 이제 디버깅 프로세스의 3 단계를 감안할 때 이것이 당연한 것 같습니다. 또한, 나는 문제없이 똑같이하는 사람들에게 인터넷 포럼에 대한 참조를 발견했습니다.

이것은 NVIDIA 9400M (Mac OS X)에서 발생합니다. OpenGL Extension Viewer는이 작업을 수행하는 데 필요한 모든 확장 기능이 있음을보고합니다.

이 문제의 원인에 대한 통찰력은 인정됩니다.

답변

2

6 분 후에 나 자신의 대답을 생성 할 수 있도록 관리했습니다. 내 방어에서, 이유는 조금 이상했다.

다른 곳에서는 밉맵을 생성하는 확장 인 GL_GENERATE_MIPMAP_SGIS를 사용하도록 설정했습니다. glFramebufferTexture2DEXT를 호출 할 때 밉맵 LOD를 지정하지 않았습니다.

이 두 가지가 결합 된 것처럼 보였습니다. 최종 패스에서 텍스처가 사용 중지되었습니다. 큐브 맵을 렌더링하는 동안 GL_GENERATE_MIPMAP_SGIS를 끄면 문제가 해결됩니다.

건배.