LWJGL Forum

Programming => OpenGL => Topic started by: AndyGFX on November 05, 2010, 20:51:54

Title: FBO issue
Post by: AndyGFX on November 05, 2010, 20:51:54
Hi, i work last few weeks on my jFinal3D graphics engine, and now i have strange problem. When i render scene to FBO, scene looks like on image

(http://java.intelligentdevelopment.sk/images/fbo_wrong_depth.png)

but without FBO looks OK. Where is a problem?



Title: Re: FBO issue
Post by: kappa on November 05, 2010, 20:58:01
looks like your not setting your z-depth buffer properly or something.
Title: Re: FBO issue
Post by: AndyGFX on November 05, 2010, 21:35:47
OK. now i have added DEPTH component to FBO, but result is black :(


...
EXTFramebufferObject.glBindFramebufferEXT(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, this.FBO_id);
EXTFramebufferObject.glRenderbufferStorageEXT(EXTFramebufferObject.GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, this.width, this.height);
EXTFramebufferObject.glBindFramebufferEXT(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, 0);
   
EXTFramebufferObject.glFramebufferTexture2DEXT(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, EXTFramebufferObject.GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, this.texture_id, 0);
EXTFramebufferObject.glFramebufferRenderbufferEXT(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, EXTFramebufferObject.GL_DEPTH_ATTACHMENT_EXT, EXTFramebufferObject.GL_RENDERBUFFER_EXT, this.FBO_id);
...
Title: Re: FBO issue
Post by: Matzon on November 05, 2010, 22:11:09
You should consider static imports :)
Title: Re: FBO issue
Post by: spasi on November 06, 2010, 11:53:10
Your code above is wrong, it's missing a renderbuffer object. It should be like this:

this.RB_id = glGenRenderbuffersEXT();
...
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, this.RB_id);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, this.width, this.height);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
   
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, this.texture_id, 0);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, this.RB_id);
...
Title: Re: FBO issue
Post by: AndyGFX on November 06, 2010, 16:44:00
thx spasi, i found it a few hours ago. Here is working part of my FBO class:


....

public TF3D_FrameBufferObject2(String _name,int w, int h)
{
this.name = _name;
this.width = w;
this.height = h;

// Set up the FBO and the Texture
buffer = ByteBuffer.allocateDirect(1 * 4).order(ByteOrder.nativeOrder()).asIntBuffer();
glGenFramebuffers(buffer); // generate
this.FBO_id = buffer.get();

// RENDER BUFFER

buffer = BufferUtils.createIntBuffer(1);
glGenRenderbuffers(buffer);
this.RBO_id = buffer.get();

    glEnable(GL_TEXTURE_2D);
   
    // Create shared texture
    IntBuffer texture_buffer = ByteBuffer.allocateDirect(4).order(ByteOrder.nativeOrder()).asIntBuffer();
    glGenTextures(texture_buffer);
    this.texture_id = texture_buffer.get(0);
   
    glBindTexture(GL_TEXTURE_2D, this.texture_id);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, BufferUtils.createIntBuffer(width * height * 4));

    //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
   
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glBindFramebuffer(GL_FRAMEBUFFER, this.FBO_id);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, this.texture_id, 0);
   
   
    // attach renderbufferto framebufferdepth buffer
    glBindRenderbuffer(GL_RENDERBUFFER, this.RBO_id);
    glRenderbufferStorage(GL_RENDERBUFFER,GL_DEPTH_COMPONENT24, this.width, this.height);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, this.RBO_id);
   
   
    // CLOSE TETXURE and BUFFER
    glBindFramebuffer(GL_FRAMEBUFFER, 0);    
glBindTexture(GL_TEXTURE_2D, 0);
   
}

public int GetTexture()
{
return this.texture_id;
}

public void BeginRender()
{


glBindFramebuffer( GL_FRAMEBUFFER, this.FBO_id );

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
glPushAttrib(GL_VIEWPORT_BIT);
glViewport(0,0,this.width, this.height);


}

public void EndRender()
{
glPopAttrib();
glBindFramebuffer( GL_FRAMEBUFFER, 0);
}

...