2012-03-03 2 views
1

OpenGL ES 1.1 텍스처를 만들려고하는데 렌더링 된 내용으로 채 웁니다. 장면에화면에 렌더링 된 텍스처가 화면에 빈 사각형을 렌더링합니다.

glGenTextures(1, &texture); 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 

GLuint texFrambuffer; 
glGenFramebuffers(1, &texFrambuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, texFrambuffer); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); 

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER) ; 
if(status != GL_FRAMEBUFFER_COMPLETE) { 
    NSLog(@"failed to make complete framebuffer object %x", status); 
    // this message doesn't appear, thus, framebuffer is complete 
} 

glViewport(0, 0, 32, 32); 

glClearColor(1.0f, 0.0f, 1.0f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT); 

GLfloat vertices[] = { 
    10.0f, 10.0f, 0.0f, 
    20.0f, 40.0f, 0.0f, 
    10.0f, 30.0f, 0.0f 
}; 
glColor4f(0.0f, 1.0f, 0.0f, 1.0f); 
glVertexPointer(3, GL_FLOAT, 0, vertices); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); 

glBindFramebuffer(GL_FRAMEBUFFER, 0); 
glDeleteFramebuffers(1, &texFrambuffer); 

렌더링 텍스처 :

텍스처를 준비

glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, texture); 

glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 
GLshort texCoord[] = {0, 0, 0, 1, 1, 0, 1, 1}; 
GLfloat vertices2[] = {0.0, 0.0, 0.0, 31.0f, 31.0f, 0.0f, 31.0f, 31.0f}; 
glVertexPointer(2, GL_FLOAT, 0, vertices2); 
glTexCoordPointer(2, GL_SHORT, 0, texCoord); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

glDisable(GL_TEXTURE_2D); 

전체 소스 코드의 Bitbucket에서 볼 수 있습니다 : https://bitbucket.org/amjaliks/gl2/src/66ee4932e212/GL2/GL2View.m

가 다른 콘텐츠는 제대로 렌더링됩니다. 이 텍스처만으로 문제가 발생합니다. 흰색 직사각형으로 렌더링됩니다.

나는 많은 예제를 연구했지만 여전히 내가 잘못하고있는 것을 파악할 수 없다. 없어진 물건 있어요?


업데이트 1 :은 내가 glClearColor()를 설정 한 경우, 발견 및 texFrambuffer가 결합되는 동안, 이러한 변경 내 텍스처 glClear()을 저장 전화를했다. 따라서 glDrawArrays() 및/또는 이와 관련된 문제가 있습니다.

texFrambuffer에 매트릭스 모드와 영사를 특별히 설정해야합니까?


업데이트 2 : 나는 질감에 "주"프레임 버퍼의 내용을 복사 glCopyTexImage2D을 사용하는 것도 노력했다. 의 Bitbucket에서 사용할 수

glGenTextures(1, &texture); 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 

glViewport(0, 0, 32, 32); 

glClearColor(1.0f, 0.75f, 0.5f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT); 
GLfloat vertices[] = { 
    0.0f, 0.0f, 0.0f, 
    20.0f, 32.0f, 0.0f, 
    10.0f, 30.0f, 0.0f 
}; 
glColor4f(0.0f, 1.0f, 0.0f, 1.0f); 
glVertexPointer(3, GL_FLOAT, 0, vertices); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); 

glBindTexture(GL_TEXTURE_2D, texture); 
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 32, 32, 0); 

전체 소스 코드 : https://bitbucket.org/amjaliks/gl2/src/b3339661650e/GL2/GL2View.m

결과는 동일합니다. 채워진 직사각형. 저의 행렬에는 분명히 문제가있는 것처럼 보입니다.

+0

당신은 glGenFramebuffersOES, glBindFramebufferOES 등을 사용하지 않을 것입니다 ... 코어 대신 OES 기능을 사용 하시겠습니까? ES 1.1에는 Core에 Framebuffer 객체가 없기 때문에 Extension으로 사용할 수 있습니다. –

+0

애플이 API를 합병 한 것으로 보인다. OES와 OES가없는 메서드를 사용하는 데 차이가 없습니다. –

+0

무슨 뜻입니까? 병합 되었습니까? Apple 설명서에도 다음과 같이 쓰여 있습니다. https://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/OpenGLESontheiPhone/OpenGLESontheiPhone.html#//apple_ref/doc/uid/TP40008793-CH101-SW6 (프레임 버퍼 객체는 iOS의 유일한 렌더링 타겟입니다.) GLES 1.1에서는 OES_framebuffer_object 확장을 사용해야합니다. –

답변

0

문제는 매트릭스입니다. 기본적으로 프로젝션 매트릭스는 ID입니다. 따라서 뷰포트에 (-1, -1) - (+ 1, + 1) 좌표를 부여합니다. 대부분 직각 투영이 (0,0) - (32,32) 정사각형이어야합니다.

관련 문제