2017-05-11 1 views
0

크로노스에서 일반의 OpenGL-ES 2.0 documenation 적어도 아이폰 OS 구현을 나는 GL_INVALID_OPERATION의 조건 중 어느 것에도 해당하지 않아서 것을 확인했다 https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glFramebufferTexture2D.xmlglFramebufferTexture2D가 EAGLContext로 잘못된 상태를 반환하는 추가 이유는 무엇입니까?

에 관한에서 불완전한 것,하지만 내가 반환되는거야 상태입니다.

이 작업은 가끔 성공하지만 일반적으로 어떤 이유로 든 오류가 발생합니다.

그것은 내가 텍스처

func fullColorFrameBuffer(_ fbo:GLuint, rbo:GLuint, texture:GLuint, size:CGSize) -> GLuint 
{ 
    print("full color framebuffer fbo:\(fbo) rbo:\(rbo) texture:\(texture) size:\(size)") 
    glBindFramebuffer(GLenum(GL_FRAMEBUFFER), fbo) 
    glBindRenderbuffer(GLenum(GL_RENDERBUFFER), rbo) 

    glRenderbufferStorage(GLenum(GL_RENDERBUFFER), GLenum(GL_RGBA8_OES), GLsizei(size.width), GLsizei(size.height)) 
    glFramebufferRenderbuffer(GLenum(GL_FRAMEBUFFER), GLenum(GL_COLOR_ATTACHMENT0), GLenum(GL_RENDERBUFFER), rbo) 

    self.assertNoGLError() 

    glActiveTexture(GLenum(GL_TEXTURE0)) 
    glBindTexture(GLenum(GL_TEXTURE_2D), fbo) 

    self.assertNoGLError() 

    glTexParameteri(GLenum(GL_TEXTURE_2D), GLenum(GL_TEXTURE_WRAP_S), GL_CLAMP_TO_EDGE); 
    glTexParameteri(GLenum(GL_TEXTURE_2D), GLenum(GL_TEXTURE_WRAP_T), GL_CLAMP_TO_EDGE); 
    glTexParameteri(GLenum(GL_TEXTURE_2D), GLenum(GL_TEXTURE_MIN_FILTER), GL_LINEAR); 
    glTexParameteri(GLenum(GL_TEXTURE_2D), GLenum(GL_TEXTURE_MAG_FILTER), GL_LINEAR); 

    self.assertNoGLError() 

    glTexImage2D(GLenum(GL_TEXTURE_2D), 0, GLint(GL_RGBA), GLsizei(size.width), GLsizei(size.height), 0, GLenum(GL_RGBA), GLenum(GL_UNSIGNED_BYTE), nil) 

    self.assertNoGLError() 

    glFramebufferTexture2D(GLenum(GL_FRAMEBUFFER), GLenum(GL_COLOR_ATTACHMENT0), GLenum(GL_TEXTURE_2D), texture, 0) 

    self.assertNoGLError() 

    let status = glCheckFramebufferStatus(GLenum(GL_FRAMEBUFFER)) 

    if status != GLenum(GL_FRAMEBUFFER_COMPLETE) 
    { 
     NSLog("failed to make complete framebuffer object %x", status) 
    } 

    self.assertNoGLError() 

    return status 
} 

내가 여기에 핸들을 만드는 오전 내 프레임 버퍼를 연결하고이 함수 내에서 실패 :

fileprivate func createBuffers() 
{ 
    glEnableVertexAttribArray(GLenum(LCAttributes.vertex.rawValue)) 
    glVertexAttribPointer(GLenum(LCAttributes.vertex.rawValue), 2, GLenum(GL_FLOAT), 0, GLsizei(2 * MemoryLayout<GLfloat>.size), nil) 

    glEnableVertexAttribArray(GLenum(LCAttributes.texCoord.rawValue)) 
    glVertexAttribPointer(GLenum(LCAttributes.texCoord.rawValue), 2, GLenum(GL_FLOAT), 0, GLsizei(2 * MemoryLayout<GLfloat>.size), nil) 

    glGenFramebuffers(1, &framebufferHandle) 
    glBindFramebuffer(GLenum(GL_FRAMEBUFFER), framebufferHandle) 

    glGenRenderbuffers(1, &renderbufferHandle) 
    glBindRenderbuffer(GLenum(GL_RENDERBUFFER), renderbufferHandle) 

    glGenTextures(1, &targetTexture) 


    print("createBuffers fbo:\(framebufferHandle) rbo:\(renderbufferHandle) texture:\(targetTexture)") 
} 

간단히 말하자면; iOS에서이 함수가 반환 한 GL_INVALID_OPERATION에 대한 다른 알려진 이유는 무엇입니까? 또는이 버그에 대한 조사 지점은 무엇입니까? 나는 올바른 스레드에 있고 동일한 EAGLContext가 사용되었다는 것을 확인했습니다. 보기가 올바르게 설정되었는지 확인했습니다.

+0

스레드를 언급 했으므로 하나의 스레드 만 컨텍스트에 액세스하고 있습니다. 그렇습니까? –

+0

다른 곳에서'GLenum'은 무엇이 있을까요? –

+0

다른 스레드의 컨텍스트를 터치하는 것은 없습니다 ... 별도의 큐에서 실행중인 비디오 플레이어가 있습니다. 메인 스레드에서, 나는 텍스쳐를 버퍼로 복사하고있다. 지금이 과정을 두 번 확인해 보겠습니다. 모든 GLenum은 GL 작업을하려고 할 때 신속하게 추악하기 때문에입니다. 컴파일을 위해 꽤 많이 캐스팅해야합니다. – michael

답변

0

오래되었지만 iOS와 비슷한 문제가있었습니다. IIRC, 그것은 RenderBuffer 저장 형식과 관련이 있습니다. 이것을 시도하십시오 :

glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, GLsizei(size.width), GLsizei(size.height)); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo); 

그래도 알려지지 않으면 전체 RTT 작성 기능을 게시 할 것입니다.

+0

감사합니다. 이것은 아무것도 고치지 않았다. 그러나 glFramebufferTexture2D를 호출하기 전에 프레임 버퍼 상태를 확인하도록 결정했습니다. 웬일인지, 그것은 내가 가지고있는 문제를 해결했다. 그리고 나는 그것을 지금 완전히 복제 할 수 없다. – michael

관련 문제