2013-01-23 4 views
0

첫 섀도우 맵을 실행하려고 시도하고 있습니다 (here).하지만 매우 이상한 문제가 있습니다. 다음은 오류의 원인이되는 코드입니다.OpenGL에서 텍스처 바인딩이 실패했습니다.

@interface HSOpenGLView() { 
    GLuint shadowFramebuffer; 
    GLuint shadowTexture; 
} 

@end 

@implementation HSOpenGLView 

- (void) drawRect:(NSRect)dirtyRect { 

} 

#pragma mark - Init 

- (void) prepareOpenGL { 
    [super prepareOpenGL]; 

    glEnable(GL_TEXTURE_2D); 

    glGenFramebuffers(1, &shadowFramebuffer); 
    glBindFramebuffer(GL_FRAMEBUFFER, shadowFramebuffer); 

    // Depth texture. Slower than a depth buffer, but you can sample it later in your shader 
    glGenTextures(1, &shadowTexture); 
    glBindTexture(GL_TEXTURE_2D, shadowTexture); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, 1024, 1024, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

    //glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, shadowTexture, 0); 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, shadowTexture, 0); 
    //glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, shadowTexture); 

    glDrawBuffer(GL_NONE); // No color buffer is drawn to. 

    // Always check that our framebuffer is ok 
    if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { 
     NSLog(@"Failed to create the shadow framebuffer! %u", glGetError()); 
    } 
} 

이 클래스는 'NSOpenGLView'의 하위 클래스입니다. 오류 번호를 인쇄하면 '0'으로 판명됩니다. 무엇 때문에 그 원인이 될 수 있습니까?

+0

'glGetError()'의 결과를 로깅하는 것이 아니라'glCheckFramebufferStatus'의 반환 값을 출력해야합니다. framebuffer 객체의 상태에 따라 다양한 값을 반환합니다. – bdash

+0

좋아, 내가 '36060'을 주겠다고했지만 그 코드가 무엇인지에 대한 정보를 찾을 수 없었다. – Justin

+1

그건'GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER'입니다. – bdash

답변

2

glDrawBuffer(GL_NONE)으로 전화 한 후 glReadBuffer(GL_NONE)에 전화를 겁니다. FBO에 읽기 작업을위한 색상 버퍼 소스가 없다는 것을 나타내야합니다.

+0

글쎄, 나는 오류가 발생하지 않습니다. 나는 이것이 올바르게 작동하고 있음을 의미한다고 가정 할 것입니다. 내가 찾지 못하면 다시보고 할 것입니다. 고맙습니다. – Justin

관련 문제