크로노스에서 일반의 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가 사용되었다는 것을 확인했습니다. 보기가 올바르게 설정되었는지 확인했습니다.
스레드를 언급 했으므로 하나의 스레드 만 컨텍스트에 액세스하고 있습니다. 그렇습니까? –
다른 곳에서'GLenum'은 무엇이 있을까요? –
다른 스레드의 컨텍스트를 터치하는 것은 없습니다 ... 별도의 큐에서 실행중인 비디오 플레이어가 있습니다. 메인 스레드에서, 나는 텍스쳐를 버퍼로 복사하고있다. 지금이 과정을 두 번 확인해 보겠습니다. 모든 GLenum은 GL 작업을하려고 할 때 신속하게 추악하기 때문에입니다. 컴파일을 위해 꽤 많이 캐스팅해야합니다. – michael