2014-11-30 3 views
0

나는 작은 OpenGL 문제로 달리고 있는데 누군가가 나를 도울 수 있는지 궁금해하고 있었다. 기본적으로 fbo를 실행하려고하면 텍스처에 무언가를 그릴 수 있지만 전체 텍스처에 단 하나의 픽셀 만 렌더링하는 것처럼 보입니다.렌더링 텍스처에 그리기 할 때 문제가 발생합니다. (OpengGL 3.3)

프레임 버퍼없이 렌더링을 heres 정상 : http://puu.sh/dbMJK/332f60d5dc.png

와 함께 : 프레임 버퍼 http://puu.sh/dbMRK/e77134c646.png

정점 셰이더 :

in vec3 in_Vertex; 
in vec2 in_TexCoord0; 

out vec2 coordTexture; 

void main() { 
    coordTexture = in_TexCoord0; 
    gl_Position = vec4(in_Vertex, 1.0); 
} 

fargment 쉐이더 :

in vec2 coordTexture; 

uniform sampler2D tex; 

out vec4 out_Color; 

void main() { 
    out_Color = texture(tex, coordTexture); 
} 

을 Heres되고 내가 취하는 기능 현재 FBO 관리 :

GLuint Game::createTexture(int w, int h, bool isDepth){ 
GLuint textureID; 
glGenTextures(1, &textureID); 
glBindTexture(GL_TEXTURE_2D, textureID); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 

int i = glGetError(); 
if (i != 0) 
{ 
    printf("DUCK YOU create texture error: %s\n", glewGetErrorString(i)); 
} 
glBindTexture(GL_TEXTURE_2D, 0); 
return textureID; 
} 

void Game::createFBO(){ 
renderTexture = createTexture(800, 600, false); 
glGenFramebuffers(1, &FBO); 
glBindFramebuffer(GL_FRAMEBUFFER, FBO); 

GLuint depthrenderbuffer; 
glGenRenderbuffers(1, &depthrenderbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, depthrenderbuffer); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, 800, 600); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthrenderbuffer); 


// GL_COLOR_ATTACHMENT0 
// GL_DEPTH_ATTACHMENT 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderTexture, 0); 


// Set the list of draw buffers. 
GLenum DrawBuffers[1] = { GL_COLOR_ATTACHMENT0 }; 
glDrawBuffers(1, DrawBuffers); // "1" is the size of DrawBuffers 


int i = glCheckFramebufferStatus(GL_FRAMEBUFFER); 
if (i != GL_FRAMEBUFFER_COMPLETE) 
{ 
    printf("DUCK YOU FRAMEBUFFER BUFFED YOU: %i\n", i); 
} 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 
} 

void Game::windowLoop(sf::Window *window){ 

static const GLfloat g_quad_vertex_buffer_data[] = { 
    -1.0f, -1.0f, 0.0f, 
    1.0f, -1.0f, 0.0f, 
    -1.0f, 1.0f, 0.0f, 
    -1.0f, 1.0f, 0.0f, 
    1.0f, -1.0f, 0.0f, 
    1.0f, 1.0f, 0.0f, 
}; 

GLuint quad_vertexbuffer; 
glGenBuffers(1, &quad_vertexbuffer); 
glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(g_quad_vertex_buffer_data), g_quad_vertex_buffer_data, GL_STATIC_DRAW); 


bool running = true; 

while (running){ 
    // handle events 
    sf::Event event; 
    while (window->pollEvent(event)){ 
     if (event.type == sf::Event::Closed || sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)){ 
      // end the program 
      running = false; 
     } 
     else if (event.type == sf::Event::Resized){ 
      // adjust the viewport when the window is resized 
      glViewport(0, 0, event.size.width, event.size.height); 
     } 
    } 
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glBindFramebuffer(GL_FRAMEBUFFER, FBO); 
    glEnable(GL_DEPTH_TEST); 
    glClearColor(0.3f, 0.2f, 0.4f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    gameLoop(window); 

    glBindFramebuffer(GL_FRAMEBUFFER, 0); 
    glUseProgram(screenShader.getProgramID()); 
    glDisable(GL_DEPTH_TEST); 
    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); 
    glVertexAttribPointer(
     0,     // attribute 0. No particular reason for 0, but must match the layout in the shader. 
     3,     // size 
     GL_FLOAT,   // type 
     GL_FALSE,   // normalized? 
     0,     // stride 
     (void*)0   // array buffer offset 
     ); 
    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, renderTexture); 

    glDrawArrays(GL_TRIANGLES, 0, 6); 

    glDisableVertexAttribArray(0); 
    glBindTexture(GL_TEXTURE_2D, 0); 
    glUseProgram(0); 

    window->display(); 
} 
} 
+1

실수로 버텍스 쉐이더를 프래그먼트 셰이더로 붙여 넣었습니다. – derhass

+0

아, 고맙습니다. – OpenGLMasterRace

답변

1

쿼드 렌더링에 텍스쳐 좌표를 제공하지 않습니다. 또한 코드 주석은 GL 코드의 layout 한정자를 통해 명시 적으로 속성 위치를 설정하는 것을 제안하지만 사용자가하지 않기 때문에 속성 변수와 위치 간의 매핑이 정의되지 않았거나 적어도 붙여 넣은 코드 부분에서 명확하지 않습니다 .

+0

오, 당신이 옳은 것 같아, 내가 고칠거야. 그리고 실제로 나는 코드를 수정하여 놓친 마지막 2 일 동안의 코드를 여러 번 수정했습니다. – OpenGLMasterRace

+0

이제 모든 것이 제대로 작동하는지 확인할 수 있습니다. 감사 ! – OpenGLMasterRace