2014-06-17 3 views
0

이 FBO에는 깊이 버퍼와 4 개의 첨부 파일이 있습니다. 나는 네 번째 색깔 부착에서 커서와 값을 잡는 곳에서 부서 버퍼를 읽고 싶다. 나는이 두 가지를 관리하지 않는 것 같습니다. 이 수업을 작성했습니다 :FBO 첨부 파일이있는 glreadpixels

class Picker3D{ 
    public: 
bool useAtachment; 
GLenum atachment; 
float PickerLastSignature; 
point3f PickerLastPos; 

Picker3D(bool useAtachment = true , GLenum atachment = GL_COLOR_ATTACHMENT3) : useAtachment(useAtachment) , atachment(atachment) { 

} 

void SetObjectSignature(float signature , GLSL_Prog prog){ 
    glUniform1f(glGetUniformLocation(prog.PR , "Signature") , signature); 
} 

float getSignature(float x , float y , float height){ 
    glGetError(); 
    if(useAtachment) 
     glReadBuffer(atachment); 

    cout << " Error message1 : " << glGetError() << endl ; 

    float *pixels = new float[4]; 
    glReadPixels(x , height - y , 1 , 1 , GL_RGB , GL_FLOAT , pixels); 
    PickerLastSignature = pixels[1]; 

    cout << " Error message2 : " << glGetError() << endl ; 

    return PickerLastSignature; 
} 

point3f get3DPosition(float x , float y , float height){ 
    //glReadBuffer(GL_DEPTH_ATTACHMENT); 

    double depth; 
    glReadPixels(x , y , 1 , 1 , GL_DEPTH_COMPONENT , GL_FLOAT , &depth); 

    cout << depth << endl; 

    int viewport[4]; 
    float *modelview; 
    double projection[16]; 
    double ModelView[16]; 

    modelview = mat4f::GetTopMatrix().returnTransposedMatrix().returnFloatArray(); 
    for(int i = 0 ; i < 16 ; i++){ 
     ModelView[i] = modelview[i]; 
    } 

    glGetDoublev(GL_PROJECTION_MATRIX, projection); 
    glGetIntegerv(GL_VIEWPORT, viewport); 

    double x1 , y1 , z1; 

    gluUnProject(x , height - y , depth , ModelView , projection , viewport , &x1 , &y1 , &z1); 

    PickerLastPos = point3f(x1 , y1 , z1); 
    return PickerLastPos; 
} 

}};

와 나는 그렇게

//

BindFrameBuffer(); 
drawStuff(); 
Picker.get3DPosition(x , y , height); 
Picker.getSignature(x , y , height); 
UnbindBuffer(); 
drawSecondPass(); 
endDrawSecondPass(); 
// check Values of PickerLastPos and PickerLastSignature 
SwapBuffers(); 
가 화면에 노력하고 getSignature 오류 1282 (잘못된 연산을 제공 altrough 깊이가 변경되지

, 내가 생각하는 메인 루프처럼 사용) glReadBuffer와 라인에서.

메인 루프는 다음과 같습니다

   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 

      /// deferred pass 

      DefFBO->drawFBO(); 
      GeometryShader.UseNow(); 

      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 

      // load the view matrix and set the camera 
      cam.camera_set(); 
      cam.camera_get(GeometryShader); 

      // load identity for model matrix 
      mat4f::LoadIdentity(); 

      /// Geometry Drawing 

      mat4f::PushMatrix(); 

       mat4f::Translate(0 , 0 , -10); 
       Picker.SetObjectSignature(1.0f , GeometryShader); 
       T90.obj_rend(GeometryShader); 
       Picker.SetObjectSignature(2.0f , GeometryShader); 
       Town.obj_rend(GeometryShader); 

      mat4f::PopMatrix(); 

      Picker.get3DPosition(Window.Mouse->mouse_x , Window.Mouse->mouse_y , Window.Height); 

      /// setting the deferred read from buffer part 

      // last read from framebuffer 
      Picker.getSignature(Window.Mouse->mouse_x , Window.Mouse->mouse_y , Window.Height); 

      // unbind FBO 
      DefFBO->readFBO(); 

      // use fragment shader, for lights and for post processing 
      FragmentShader.UseNow(); 

      // send windows width and height and bind multiple textures 
      DefFBO->send_to_GLSL(FragmentShader.PR); 

      // send view matrix to the shader 
      cam.camera_get(FragmentShader); 

      glDepthMask(GL_FALSE); 
      glEnable(GL_DEPTH_TEST); 

      glUniform3f(glGetUniformLocation(FragmentShader.PR , "CameraPosition") , cam.x , cam.y , cam.z); 

      /// final draw 
      DefFBO->sendGlobalLight(FragmentShader , point3f(0 , 1 , 0) , point3f(0.3 , 0.3 , 0.3) , point3f(0.9 , 0.9 , 0.9)); 

      cout << Picker.PickerLastPos << endl; 

      DefFBO->end_read(); 

      glEnable(GL_DEPTH_TEST); 
      glDepthMask(GL_TRUE); 
+0

주석 처리 된 줄 중 하나에서 알아 차린 점을 지적하기 바란다 : // glReadBuffer (GL_DEPTH_ATTACHMENT). 그건 작동하지 않을 것입니다, 그 명령으로 설정된 읽기 버퍼는 컬러 버퍼이므로 실제로는 FRONT/BACK/LEFT/RIGHT (또는 이들의 조합)와'GL_COLOR_ATTACHMENTi' 만 유효한 값입니다. 그래도 다른 것에 대해 언급하기에는 너무 많은 누락 된 코드가 있습니다. 실제 FBO 설정 (예 : 어디에 부착되어 있는지)은 나열되지 않습니다. 'GL_INVALID_OPERATION'은 잘못된 FBO 바운드가 있다고 믿게하거나, 실제로는'GL_COLOR_ATTACHMENT3'에 붙어있는 것이 아닙니다. –

답변

0

@Andon가 지적했듯이 나는 그것에서 데이터에 geting 독서를위한 FBO를 결합했다 보인다. 나는 GL_DRAW_FRAMEBUFFER와 바인딩했다.

+0

그렇습니다. GL_FRAMEBUFFER와 GL_DRAW_FRAMEBUFFER, GL_READ_FRAMEBUFFER를 분리하는 아이디어입니다. 그것은 당신이 독자적으로 어떤 프레임 버퍼를 그리고 프레임 버퍼를 읽는 지 독립적으로 제어 할 수있게합니다. 이를 수행 할 수 있다는 것은 프레임 버퍼에서 읽고 쓰는 연산들, 특히'glBlitFramebuffer()'에서 매우 중요합니다. 그러나'glReadPixels()'와 같은 다른 읽기 연산에도 적용됩니다. –