2013-10-28 2 views
0

프레임 버퍼 오브젝트를 설정하는 방법을 제어 할 수없는 프레임 버퍼 오브젝트로 작업하려고합니다. 그래서 저는 텍스처를 그리기 위해 깊이가있는 오프 스크린 fbo를 만듭니다. 그런 다음 메인 프레임 버퍼로 그립니다. OpenGL 프로파일 러를 사용하여 텍스처로부터 텍스쳐를 볼 수있는 지점에 있지만, 메인 프레임 버퍼로 그릴 수는 없습니다.메인 프레임 버퍼에 오프 스크린 프레임 버퍼 텍스처 렌더링

다음은 프로그램의이 부분은 렌더링 부분에 내 코드

GLsizei glSizeWidthEquiv = width; 
     GLsizei glSizeHeightEquiv = height; 

     GLint originalFramebuffer; 
     glGetIntegerv(GL_FRAMEBUFFER_BINDING, &originalFramebuffer); 

     if(fbo == 0){ 
      glGenFramebuffers(1, &fbo); 
     } 
     glBindFramebuffer(GL_FRAMEBUFFER, fbo); 

     //Creating texture for framebuffer 
     if(texColorBuffer == 0){ 
      glGenTextures(1, &texColorBuffer); 
     } 
     glBindTexture([outTex target], texColorBuffer); 
     //Having it as null means the texture's data will be created dynamically 
     //Using RGBA since the alpha layer is going to be needed 
     glTexImage2D([outTex target], 0, GL_RGBA_FLOAT16_APPLE, glSizeWidthEquiv, glSizeHeightEquiv, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 

     glTexParameteri([outTex target], GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
     glTexParameteri([outTex target], GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
     //Attach texture to framebuffer 
     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, [outTex target], texColorBuffer, 0); 

     //Creating render buffer 
     if(renderBuffer == 0){ 
      glGenRenderbuffers(1, &renderBuffer); 
     } 
     glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer); 
     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, glSizeWidthEquiv, glSizeHeightEquiv); 

     //Binding the renderbuffer to the framebuffer 
     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderBuffer); 

     //Check framebuffer 
     if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE){ 
      NSLog(@"Framebuffer incomplete noob\n"); 
     }else{ 
      NSLog(@"Framebuffer COMPLETE!\n"); 
     } 
     //Start to use the frame buffer 
     glBindFramebuffer(GL_FRAMEBUFFER, fbo); 
     glViewport(0, 0, glSizeWidthEquiv, glSizeHeightEquiv); 
     //cleaning texture: cleaning code here 

     //initating glTex0 
     glActiveTexture(GL_TEXTURE0); 

     //setting up texture stuff 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
        glClearColor(0, 0, 0, 1); 
     glDisable(GL_CULL_FACE); 

     glColor3f(1,0,0); 


     glBegin(GL_QUADS); 
     //box 1 in front 
     glVertex3f(0, 0, 0); 
     glVertex3f(500, 0, 0); 
     glVertex3f(500, 500, 0); 
     glVertex3f(0, 500, 0); 

     //box 2 at the back 
     glColor3f(0, 1, 0); 
     glVertex3f(-250, -250, 50); 
     glVertex3f(250, -250, 50); 
     glVertex3f(250, 250, 50); 
     glVertex3f(-250, 250, 50); 
     glEnd(); 

     glFogCoordf(9); 
     //End of framebuffer usage 
     glBindFramebuffer(GL_FRAMEBUFFER, originalFramebuffer); 
     glViewport(0, 0, (GLsizei)[outTex width], (GLsizei)[outTex height]); 
     [self glGetError]; 

     glActiveTexture(GL_TEXTURE0); 
     glBindTexture([outTex target], texColorBuffer); 
     glCopyTexSubImage2D([outTex target], 0, 0, 0, 0, 0, glSizeWidthEquiv, glSizeHeightEquiv); 


     glFlush(); 

하고 나를 새로운 버퍼를 생성에서 그것을 유지하는 나는 초기화에 0으로 FBO, renderBuffer 및 texColorBuffer을 설정합니다.

그래서 본질적으로 나는 완전히 모양새를 만들기 위해 만든 fbo를 리바 인딩 할 때까지 버퍼를 생성합니다. 원래 fbo로 다시 전환하고 그려 봅니다.

여기서 사용되는 [outTex target]은 GL_TEXTURE_RECTANGLE_ARB입니다.

내가 OpenGL을 프로파일 러의 나의 질감 부분에있는 것입니다 : http://img.photobucket.com/albums/v442/ardo/ScreenShot2013-10-27at112742PM.png

@GMasucci 나는 이것이 sscce을 만드는 올바른 방법이지만, 여기 경우 완전히 확실하지 않다

붙여 넣기를 쉽게 복사 할 수있는 코드에는 라이브러리, GLUT 및 OpenGL이 포함됩니다. 여기에 사용 된 코드는 www.videotutorialsrock.com 조명 교습을 피기 백 방식으로 지원하므로 비슷한 환경을 가지고 있습니다.

#include <iostream> 
#include <stdlib.h> 

#ifdef __APPLE__ 
#include <OpenGL/OpenGL.h> 
#include <GLUT/glut.h> 
#else 
#include <GL/glut.h> 
#endif 

using namespace std; 

GLuint fbo,texColorBuffer,renderBuffer; 
float camMatrix [4][4]; 
//Initializes 3D rendering 
void initRendering() { 
    glEnable(GL_DEPTH_TEST); 

} 

//Called when the window is resized 
void handleResize(int w, int h) { 
    glViewport(0, 0, w, h); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluPerspective(45.0, (double)w/(double)h, 1.0, 200.0); 
} 

//Draws the 3D scene 
void drawScene() { 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

glTranslatef(0.0f, 0.0f, -8.0f); 


if(fbo == 0){ 
    glGenFramebuffers(1, &fbo); 
} 
glBindFramebuffer(GL_FRAMEBUFFER, fbo); 

if(texColorBuffer == 0){ 
    glGenTextures(1, &texColorBuffer); 
} 
glBindTexture(GL_TEXTURE_2D, texColorBuffer); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 400, 400, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texColorBuffer, 0); 

if(renderBuffer == 0){ 
    glGenRenderbuffers(1, &renderBuffer); 
} 
glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 400, 400); 

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderBuffer); 

if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE){ 
    printf("Error in framebuffer completeness \n"); 
} 
glBindFramebuffer(GL_FRAMEBUFFER, fbo); 
glViewport(0, 0, 400, 400); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glActiveTexture(GL_TEXTURE0); 

glBegin(GL_QUADS); 
glColor3f(1,0,0); 
glVertex3f(0, 0, 0); 
glVertex3f(200, 0, 0); 
glVertex3f(200, 200, 0); 
glVertex3f(0, 200, 0); 

glColor3f(0, 1, 0); 
glVertex3f(-100, -100, -1); 
glVertex3f(100, -100, -1); 
glVertex3f(100, 100, -1); 
glVertex3f(-100, 100, -1); 

glEnd(); 

glFogCoordf(0); 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 
glViewport(0, 0, (GLsizei)400, (GLsizei)400); 

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, texColorBuffer); 
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 400, 400); 

glutSwapBuffers(); 
} 

void update(int value) { 
glutPostRedisplay(); 
glutTimerFunc(25, update, 0); 
} 

int main(int argc, char** argv) { 
//Initialize GLUT 
glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
glutInitWindowSize(400, 400); 

//set fbo,texBuffer and renderbuffer to 0 
fbo = 0; 
texColorBuffer = 0; 
renderBuffer = 0; 

//Create the window 
glutCreateWindow("Lighting - videotutorialsrock.com"); 
initRendering(); 

//Set handler functions 
glutDisplayFunc(drawScene); 
glutReshapeFunc(handleResize); 

glutTimerFunc(25, update, 0); //Add a timer 

glutMainLoop(); 
return 0; 
} 
+0

당신이 게시 할 수있는 모든 기회를 [sscce] (http://sscce.org/)하는 우리가 어떻게 도울 수 있는지 보여줄 수 있을까요? 우리가 최선을 다해 여전히 위의 코드로 놓인 오류를 피할 수 있습니다. 건배 :) – GMasucci

답변

0

전에는 glCopyTexSubImage2D을 사용하지 마십시오. 이는 OpenGL 맨 페이지에서 가장 잘 해석 할 수 있습니다.

http://www.opengl.org/sdk/docs/man/xhtml/glCopyTexSubImage2D.xml에서

인용구 glCopyTexSubImage2D 이차원 텍스처 화상, 큐브 맵 텍스처 이미지의 사각형 부분 또는 픽셀 1 차원 배열 질감의 슬라이스의 개수의 선형 부분을 대체 현재 GL_READ_BUFFER (glTexSubImage2D의 경우처럼 메인 메모리가 아닌)에서.

texColorBuffer에있는 내용을 originalFramebuffer으로 바꾸는 것처럼 들립니다. 다음과 같이

내가 화면에 프레임 버퍼 오브젝트를 그리는 방법은 질감 전체 화면 쿼드 함께 :

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glClearColor(0, 0, 0, 1); 
glPushMatrix(); 
    GLfloat identity[4][4]; 
    for (int i=0; i<4; ++i){ 
     for (int j=0; j<4; ++j){ 
      identity[i][j] = 0; 
     } 
    } 
    identity[0][0] = identity[1][1] = identity[2][2] = identity[3][3] = 1; 
    glMatrixMode(GL_MODELVIEW); 
    glLoadMatrixf(identity); 
    glMatrixMode(GL_PROJECTION); 
    glLoadMatrixf(identity); 

    glActiveTexture(GL_TEXTURE0); 
    glBindTexture([outTex target], texColorBuffer); 

    glBegin(GL_QUADS); 
     glVertex2f(-1,-1); 
     glTexCoord2f(0, 0); 

     glVertex2f(1,-1); 
     glTexCoord2f(1, 0); 

     glVertex2f(1, 1); 
     glTexCoord2f(1, 1); 

     glVertex2f(-1, 1); 
     glTexCoord2f(0, 1); 
    glEnd(); 
glPopMatrix(); 
+0

나는 fbo에서 텍스처를 바인딩하고 예제와 같은 쿼드를 그렸지만 내 의사 SSCCE에 포함 된 사각형 중 하나의 색상으로 끝났습니다. 또한 그것에서, 나는 거리를 구별하기 위해 서로 다른 z 좌표의 2 개의 사각형을 만들었고 z 좌표를 포함하여 그것을 렌더링하려고했습니다. – ardowz

+0

녹색 광장 만 나타 납니까? – tamato

+0

예 녹색 만 – ardowz

관련 문제