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