I’ve been trying to figure this out for hours, and it’s making me really frustrated. I don’t see what is wrong with my code. The texture that is supposed to be created by blitting is only making a black texture. I’m not sure if it’s the renderbuffer or the texture that is doing it. Here’s what I got going on:
public Framebuffer() {
this.FrameWidth = GameStructure.Window.getWidth();
this.FrameHeight = GameStructure.Window.getHeight();
//Multi-sampled FBO
fboMS = createFBO();
this.renderbufferAttachmentColorMS();
this.renderbufferAttachmentDepthMS();
if(!isComplete()) {
Console.errMsg("Framebuffer incomplete");
}
unbind();
//Single-sampled FBO
fbo = createFBO();
this.textureAttachment(texId);
if(!isComplete()) {
Console.errMsg("Framebuffer incomplete");
}
unbind();
}
private int createFBO() {
int fbo = glGenFramebuffers();
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
return fbo;
}
private void textureAttachment(int texId) {
texId = glGenTextures();
glBindTexture(GL_TEXTURE_2D, texId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, FrameWidth, FrameHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, (ByteBuffer) null);
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, texId, 0);
glBindTexture(GL_TEXTURE_2D, 0);
}
private void textureAttachmentMS(int texId) {
texId = glGenTextures();
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texId);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, Settings.antiAlias, GL_RGBA8, FrameWidth, FrameHeight, true);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, texId, 0);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
}
private void renderbufferAttachment(int rbo) {
rbo = glGenRenderbuffers();
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, FrameWidth, FrameHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
}
private void renderbufferAttachmentDepthMS() {
rboDepth = glGenRenderbuffers();
glBindRenderbuffer(GL_RENDERBUFFER, rboDepth);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, Settings.antiAlias, GL_DEPTH24_STENCIL8, FrameWidth, FrameHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rboDepth);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
}
private void renderbufferAttachmentColorMS() {
rboColor = glGenRenderbuffers();
glBindRenderbuffer(GL_RENDERBUFFER, rboColor);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, Settings.antiAlias, GL_RGBA8, FrameWidth, FrameHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rboColor);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
}
public void bind() {
glBindFramebuffer(GL_FRAMEBUFFER, fboMS);
}
public void unbind() {
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
public void blit() {
glBindFramebuffer(GL_READ_FRAMEBUFFER, fboMS);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
glBlitFramebuffer(0,0,FrameWidth,FrameHeight,0,0,FrameWidth,FrameHeight,GL_COLOR_BUFFER_BIT,GL_NEAREST);
unbind();
}