2010-04-28 3 views
0

내 알고리즘이있다 이상한 행동을 개체 imple ... 1 단계의 샘플을 2 단계의 이미지와 결합하십시오.OpenGL을 프레임 버퍼는

1 단계와 2 단계를 디버깅하려고하고 STRANGE 동작을 건너오고 있습니다. 각 그림자 매핑 패스에 대한 나의 알고리즘은 다음과 같습니다 는 깊이를 비교하는 관점 및 사용 버텍스/파편 쉐이더에서 장면을 렌더링 각 빛 의 POV에서 깊이 배열 질감에 연결된 FBO에 장면을 렌더링

내 알고리즘이 방법을 실행

화면 패스의 법선 벡터는 (아마도 반전) 잘못된 것으로 표시()

glutSwapBuffers을 선별 점에서 렌더링 FBO 에 지점에서 렌더링합니다. 확산 조명 계산이 정확하지 않기 때문에 문제는 확실하지만 재질 색상이 정확하고 그림자가 올바른 위치에 표시됩니다. 그래서 범인이 될 수있는 유일한 것은 법선처럼 보입니다.

내가

잘못 여기 //) glutSwapBuffers를 (화면에 점에서 렌더링 glutSwapBuffers()을 화면에 점에서 렌더링 FBO 를 가리킨에서 렌더링 할 그러나 경우

두 번째 패스는 정확 . 내 프레임 버퍼 호출에 문제가 있다고 가정합니다. 누구든지 문제가 아래의 로그에서 무엇인지 볼 수 있습니까? 그것의 좀 벌레를 만들기 위해 몇 가지 편집과 함께 '버퍼'에 대한 큰소리로 샅샅이 추적.

[INFO] trace.call: glGenFramebuffersEXT(1, 0xdfeb90 -> { 1 }) 
[INFO] trace.call: glGenFramebuffersEXT(1, 0xdfebac -> { 2 }) 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) 
[INFO] trace.call: glDrawBuffer(GL_NONE) 
[INFO] trace.call: glReadBuffer(GL_NONE) 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0) 
//start render to FBO 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 2) 
[INFO] trace.call: glReadBuffer(GL_NONE) 
[INFO] trace.call: glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 2, 0) 
[INFO] trace.call: glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 3, 0) 
[INFO] trace.call: glDrawBuffer(GL_COLOR_ATTACHMENT0) 
//bind to the FBO attached to a depth tex array for shadows 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) 
[INFO] trace.call: glFramebufferTextureLayerARB(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 1, 0, 0) 
[INFO] trace.call: glClear(GL_DEPTH_BUFFER_BIT) 
//draw geometry 
//bind to the FBO I want the shadow mapped image rendered to 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 2) 
[INFO] trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
//draw geometry 

//draw to screen pass 
//again shadow mapping FBO 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) 
[INFO] trace.call: glFramebufferTextureLayerARB(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 1, 0, 0) 
[INFO] trace.call: glClear(GL_DEPTH_BUFFER_BIT) 
//draw geometry 
//bind to the screen 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0) 
[INFO] trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
//finished, swap buffers 
[INFO] trace.call: glXSwapBuffers(0xd5fc10, 0x05800002) 
//INCORRECT OUTPUT 

//second try at render to screen: 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 1) 
[INFO] trace.call: glFramebufferTextureLayerARB(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 1, 0, 0) 
[INFO] trace.call: glClear(GL_DEPTH_BUFFER_BIT) 
//draw geometry 
[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0) 
[INFO] trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
draw geometry 
[INFO] trace.call: glXSwapBuffers(0xd5fc10, 0x05800002) 
//correct output
+0

정말로 "지점에서 FBO로 화면을 렌더링하여 glutSwapBuffers()"를 게시물에서 두 번 렌더링하셨습니까? –

+0

FBO에 포인트를 렌더링 한 다음 처음으로 포인트를 스크린에 렌더링하는 것을 의미했습니다. 두 번째로 FBO에 포인트를 렌더하고, 포인트를 화면에 렌더 한 다음 (여기서 스왑 버퍼는 잘못된 결과를 낳습니다) 다시 화면에 렌더링합니다. 스왑 버퍼는 올바른 결과를 나타냅니다. 혼란스럽게해서 미안합니다. 줄 바꿈이 의도 한 것처럼 명확하게 표시되지 않았을 것입니다. 제 생각에는 프레임 버퍼 매개 변수가 너무 빠르며 첫 번째 패스에서 너무 늦게 설정되어 두 번째로 괜찮 았지만 그게 무엇인지 모릅니다. –

답변

0

FBO 코드에 아무런 문제가 없습니다. 하지만 너는 우리에게 모든 것을 말하지 않고있다. 이것이 당신이 뭘하고 있었 정말 무엇 이었는가 경우 (기본 프레임 버퍼, 명확하고 스왑 버퍼를 결합하기 때문에)

[INFO] trace.call: glBindFramebufferEXT(GL_FRAMEBUFFER, 0) 
[INFO] trace.call: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
//finished, swap buffers 
[INFO] trace.call: glXSwapBuffers(0xd5fc10, 0x05800002) 
//INCORRECT OUTPUT 

는 그런 잘못된 출력은 검은 화면이 될 것입니다. glClear()와 glXSwapBuffers() 사이에 렌더링이 진행되어야합니다. 이 grep-ped 추적 대신 완전한 소스 코드를 게시해야합니다.

두 번째로 문제는 FBO와 아무런 관련이 없습니다. 그들은 어떤 방식 으로든 조명에 영향을 미치지 않습니다. 매트릭스를 올바르게 설정하지 않을 가능성이 가장 큽니다 (빛에서 룩을 믹싱하고 카메라에서 룩업을하면 엉망이되기 쉽습니다). 귀하의 대답은 약간 지저분해서 귀하의 코드가 조금 복잡 할 수도 있습니다. 아마도 당신은 그곳을 들여다보아야 할 것입니다 ...