Renderer/src/main/java/electrosphere/renderer/framebuffer/FramebufferUtils.java
2024-07-03 14:55:24 -04:00

290 lines
12 KiB
Java

package electrosphere.renderer.framebuffer;
import electrosphere.engine.Globals;
import electrosphere.renderer.OpenGLState;
import electrosphere.renderer.texture.Texture;
import java.nio.IntBuffer;
import org.lwjgl.BufferUtils;
import static org.lwjgl.opengl.GL11.GL_DEPTH_COMPONENT;
import static org.lwjgl.opengl.GL11.GL_FLOAT;
import static org.lwjgl.opengl.GL11.GL_LINEAR;
import static org.lwjgl.opengl.GL11.GL_NEAREST;
import static org.lwjgl.opengl.GL11.GL_NONE;
import static org.lwjgl.opengl.GL11.GL_RED;
import static org.lwjgl.opengl.GL11.GL_RGB;
import static org.lwjgl.opengl.GL11.GL_RGBA;
import static org.lwjgl.opengl.GL11.GL_SHORT;
import static org.lwjgl.opengl.GL11.GL_TEXTURE_WRAP_S;
import static org.lwjgl.opengl.GL11.GL_TEXTURE_WRAP_T;
import static org.lwjgl.opengl.GL11.GL_UNSIGNED_BYTE;
import static org.lwjgl.opengl.GL12.GL_CLAMP_TO_EDGE;
import static org.lwjgl.opengl.GL13.GL_CLAMP_TO_BORDER;
import static org.lwjgl.opengl.GL30.GL_COLOR_ATTACHMENT0;
import static org.lwjgl.opengl.GL30.GL_COLOR_ATTACHMENT1;
import static org.lwjgl.opengl.GL30.GL_DEPTH24_STENCIL8;
import static org.lwjgl.opengl.GL30.GL_DEPTH_STENCIL_ATTACHMENT;
import static org.lwjgl.opengl.GL30.GL_FRAMEBUFFER;
import static org.lwjgl.opengl.GL30.GL_RENDERBUFFER;
import static org.lwjgl.opengl.GL30.GL_HALF_FLOAT;
import static org.lwjgl.opengl.GL30.glBindRenderbuffer;
import static org.lwjgl.opengl.GL30.glFramebufferRenderbuffer;
import static org.lwjgl.opengl.GL30.glGenRenderbuffers;
import static org.lwjgl.opengl.GL30.glRenderbufferStorage;
import static org.lwjgl.opengl.GL45.glNamedFramebufferDrawBuffer;
import static org.lwjgl.opengl.GL45.glNamedFramebufferDrawBuffers;
import static org.lwjgl.opengl.GL45.glNamedFramebufferReadBuffer;
/**
* Utilities for framebuffer creation
*/
public class FramebufferUtils {
public static Texture generateScreenTextureColor(OpenGLState openGLState, int width, int height){
Texture texture = new Texture();
texture.glTexImage2D(openGLState, width, height, GL_RGB, GL_UNSIGNED_BYTE);
texture.setMinFilter(GL_LINEAR);
texture.setMagFilter(GL_LINEAR);
//these make sure the texture actually clamps to the borders of the quad
texture.setWrap(GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
texture.setWrap(GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
texture.checkStatus(openGLState);
return texture;
}
public static Texture generateScreenTextureColorAlpha(OpenGLState openGLState, int width, int height){
Texture texture = new Texture();
texture.glTexImage2D(openGLState, width, height, GL_RGBA, GL_UNSIGNED_BYTE);
texture.setMinFilter(GL_LINEAR);
texture.setMagFilter(GL_LINEAR);
//these make sure the texture actually clamps to the borders of the quad
texture.setWrap(GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
texture.setWrap(GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
texture.checkStatus(openGLState);
return texture;
}
public static Texture generateScreenTextureDepth(OpenGLState openGLState, int width, int height){
Texture texture = new Texture();
texture.glTexImage2D(openGLState, width, height, GL_DEPTH_COMPONENT, GL_FLOAT);
texture.checkStatus(openGLState);
return texture;
}
public static Framebuffer generateScreenTextureFramebuffer(OpenGLState openGLState, int width, int height, Texture colorTexture, Texture depthTexture){
Framebuffer buffer = new Framebuffer();
//texture
// int texture = glGenTextures();
// glBindTexture(GL_TEXTURE_2D,texture);
// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// //these make sure the texture actually clamps to the borders of the quad
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
//bind texture to fbo
buffer.setMipMapLevel(0);
buffer.attachTexture(openGLState,colorTexture);
buffer.setDepthAttachment(openGLState,depthTexture.getTexturePointer());
//check make sure compiled
buffer.checkStatus();
return buffer;
}
public static Framebuffer generateScreenTextureFramebuffer(OpenGLState openGLState, int width, int height, Texture colorTexture){
Framebuffer buffer = new Framebuffer();
//texture
// int texture = glGenTextures();
// glBindTexture(GL_TEXTURE_2D,texture);
// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// //these make sure the texture actually clamps to the borders of the quad
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
//bind texture to fbo
buffer.setMipMapLevel(0);
buffer.attachTexture(openGLState,colorTexture.getTexturePointer());
//check make sure compiled
buffer.checkStatus();
return buffer;
}
public static Framebuffer generateScreensizeTextureFramebuffer(OpenGLState openGLState){
Framebuffer buffer = new Framebuffer();
buffer.bind(openGLState);
//texture
Texture texture = new Texture();
texture.glTexImage2D(openGLState, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT, GL_RGB, GL_UNSIGNED_BYTE);
texture.setMinFilter(GL_LINEAR);
texture.setMagFilter(GL_LINEAR);
//these make sure the texture actually clamps to the borders of the quad
texture.setWrap(GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
texture.setWrap(GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
texture.checkStatus(openGLState);
//bind texture to fbo
buffer.setMipMapLevel(0);
buffer.attachTexture(openGLState,texture);
//renderbuffer
int renderBuffer = glGenRenderbuffers();
glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
//bind rbo to fbo
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderBuffer);
//check make sure compiled
buffer.checkStatus();
return buffer;
}
public static Framebuffer generateTextureFramebuffer(OpenGLState openGLState, int width, int height){
Framebuffer buffer = new Framebuffer();
buffer.bind(openGLState);
//texture
Texture texture = new Texture();
texture.glTexImage2D(openGLState, width, height, GL_RGBA, GL_UNSIGNED_BYTE);
texture.setMinFilter(GL_LINEAR);
texture.setMagFilter(GL_LINEAR);
//these make sure the texture actually clamps to the borders of the quad
texture.setWrap(GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
texture.setWrap(GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
texture.checkStatus(openGLState);
//bind texture to fbo
buffer.setMipMapLevel(0);
buffer.attachTexture(openGLState,texture);
//renderbuffer
int renderBuffer = glGenRenderbuffers();
glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);
//bind rbo to fbo
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderBuffer);
//check make sure compiled
buffer.checkStatus();
return buffer;
}
public static Renderbuffer generateScreensizeStencilDepthRenderbuffer(OpenGLState openGLState){
Renderbuffer buffer = new Renderbuffer();
buffer.bind();
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
Globals.renderingEngine.checkError();
return buffer;
}
static int depthMapWidth = 4096;
static int depthMapHeight = 4096;
public static Framebuffer generateDepthBuffer(OpenGLState openGLState){
Framebuffer buffer = new Framebuffer();
buffer.bind(openGLState);
//texture
Texture texture = new Texture();
texture.glTexImage2D(openGLState, depthMapWidth, depthMapHeight, GL_DEPTH_COMPONENT, GL_FLOAT);
texture.setMinFilter(GL_NEAREST);
texture.setMagFilter(GL_NEAREST);
texture.setWrap(GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
texture.setWrap(GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
texture.setBorderColor(new float[]{ 1.0f, 1.0f, 1.0f, 1.0f });
texture.checkStatus(openGLState);
//bind texture to fbo
buffer.setMipMapLevel(0);
buffer.setDepthAttachment(openGLState,texture.getTexturePointer());
glNamedFramebufferDrawBuffer(buffer.getFramebufferPointer(), GL_NONE);
glNamedFramebufferReadBuffer(buffer.getFramebufferPointer(), GL_NONE);
//check make sure compiled
buffer.checkStatus();
return buffer;
}
public static Texture generateDepthBufferTexture(OpenGLState openGLState, int width, int height){
Texture texture = new Texture();
texture.glTexImage2D(openGLState, width, height, GL_DEPTH_COMPONENT, GL_SHORT);
texture.setMinFilter(GL_NEAREST);
texture.setMagFilter(GL_NEAREST);
texture.setWrap(GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
texture.setWrap(GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
texture.setBorderColor(new float[]{ 1.0f, 1.0f, 1.0f, 1.0f });
texture.checkStatus(openGLState);
return texture;
}
public static Framebuffer generateDepthBuffer(OpenGLState openGLState, int width, int height, Texture texture){
Framebuffer buffer = new Framebuffer();
buffer.bind(openGLState);
//bind texture to fbo
buffer.setMipMapLevel(0);
buffer.setDepthAttachment(openGLState,texture.getTexturePointer());
glNamedFramebufferDrawBuffer(buffer.getFramebufferPointer(), GL_NONE);
glNamedFramebufferReadBuffer(buffer.getFramebufferPointer(), GL_NONE);
//check make sure compiled
buffer.checkStatus();
return buffer;
}
public static Texture generateOITAccumulatorTexture(OpenGLState openGLState, int width, int height){
Texture texture = new Texture();
texture.setMinFilter(GL_LINEAR);
texture.setMagFilter(GL_LINEAR);
texture.glTexImage2D(openGLState, width, height, GL_RGBA, GL_HALF_FLOAT);
texture.checkStatus(openGLState);
return texture;
}
public static Texture generateOITRevealageTexture(OpenGLState openGLState, int width, int height){
Texture texture = new Texture();
texture.setMinFilter(GL_LINEAR);
texture.setMagFilter(GL_LINEAR);
texture.glTexImage2D(openGLState, width, height, GL_RED, GL_FLOAT);
texture.checkStatus(openGLState);
return texture;
}
public static Framebuffer generateOITFramebuffer(OpenGLState openGLState, int width, int height, Texture accumulatorTex, Texture revealageTex, Texture depthTexture){
Framebuffer buffer = new Framebuffer();
buffer.bind(openGLState);
//bind texture to fbo
buffer.setMipMapLevel(0);
buffer.attachTexture(openGLState,accumulatorTex.getTexturePointer(),0);
buffer.attachTexture(openGLState,revealageTex.getTexturePointer(),1);
buffer.setDepthAttachment(openGLState,depthTexture.getTexturePointer());
// const GLenum transparentDrawBuffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
// glDrawBuffers(2, transparentDrawBuffers);
IntBuffer drawBuffers = BufferUtils.createIntBuffer(2);
drawBuffers.put(GL_COLOR_ATTACHMENT0);
drawBuffers.put(GL_COLOR_ATTACHMENT1);
drawBuffers.flip();
glNamedFramebufferDrawBuffers(buffer.getFramebufferPointer(),drawBuffers);
//check make sure compiled
buffer.checkStatus();
return buffer;
}
}