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