work on fixing framebuffer bugs
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good

This commit is contained in:
austin 2025-05-14 22:35:34 -04:00
parent 5b9b4bd048
commit 2cefc2e228
5 changed files with 25 additions and 14 deletions

View File

@ -1787,6 +1787,7 @@ Grid alignment offsets work
Inventory state in non-creatures actually saves/loads to/from disk
Fix virtual scrollable mouse alignment for events
Remove warnings for fast loading
Work on debugging framebuffers

View File

@ -49,7 +49,7 @@ public class ControlCategoryMenuNav {
handler.addControl(INPUT_CODE_MENU_MOUSE_PRIMARY, new Control(ControlType.MOUSE_BUTTON,GLFW.GLFW_MOUSE_BUTTON_LEFT,false,"Mouse primary",""));
handler.addControl(MENU_SCROLL, new Control(ControlType.MOUSE_SCROLL,0,false,"",""));
handler.addControl(MENU_DRAG_START, new Control(ControlType.MOUSE_MOVEMENT,0,false,"",""));
handler.addControl(MENU_CAPTURE_SCREEN, new Control(ControlType.KEY,GLFW.GLFW_KEY_F4,true,"Screenshot","Takes a screenshot of the engine"));
handler.addControl(MENU_CAPTURE_SCREEN, new Control(ControlType.KEY,GLFW.GLFW_KEY_F12,true,"Screenshot","Takes a screenshot of the engine"));
handler.addControl(MENU_DRAG_MANIPULATE, new Control(ControlType.MOUSE_BUTTON,GLFW.GLFW_MOUSE_BUTTON_1,false,"",""));
}

View File

@ -115,6 +115,7 @@ public class OpenGLState {
viewport.x = x;
viewport.y = y;
GL40.glViewport(0, 0, viewport.x, viewport.y);
Globals.renderingEngine.checkError();
}
}

View File

@ -144,11 +144,15 @@ public class RenderingEngine {
static float aspectRatio = 1.0f;
static float verticalFOV = 90.0f;
//the current state of the rendering pipeline
/**
* the current state of the rendering pipeline
*/
static RenderPipelineState renderPipelineState = new RenderPipelineState();
//the opengl state
static OpenGLState openGLState = new OpenGLState();
/**
* the opengl state
*/
OpenGLState openGLState = new OpenGLState();
/**
* The opengl context the rendering engine is running within

View File

@ -20,7 +20,6 @@ import org.lwjgl.opengl.GL45;
import static org.lwjgl.opengl.GL11.GL_NONE;
import static org.lwjgl.opengl.GL11.GL_TEXTURE;
import static org.lwjgl.opengl.GL30.GL_FRAMEBUFFER;
import static org.lwjgl.opengl.GL45.glCheckNamedFramebufferStatus;
/**
* Framebuffer object
@ -88,7 +87,7 @@ public class Framebuffer {
* @param openGLState The opengl state
*/
public void bind(OpenGLState openGLState){
openGLState.glBindFramebuffer(GL40.GL_FRAMEBUFFER, framebufferPointer);
openGLState.glBindFramebuffer(GL40.GL_FRAMEBUFFER, this.framebufferPointer);
}
/**
@ -99,7 +98,7 @@ public class Framebuffer {
if(this.framebufferPointer == DEFAULT_FRAMEBUFFER_POINTER){
throw new Error("Pointer is the default framebuffer!");
}
return glCheckNamedFramebufferStatus(this.framebufferPointer,GL40.GL_FRAMEBUFFER) == GL40.GL_FRAMEBUFFER_COMPLETE;
return GL45.glCheckNamedFramebufferStatus(this.framebufferPointer,GL40.GL_FRAMEBUFFER) == GL40.GL_FRAMEBUFFER_COMPLETE;
}
@ -158,7 +157,7 @@ public class Framebuffer {
* Blocks the thread until the framebuffer has compiled
*/
public void blockUntilCompiled(){
while(glCheckNamedFramebufferStatus(this.framebufferPointer,GL40.GL_FRAMEBUFFER) != GL40.GL_FRAMEBUFFER_UNDEFINED){
while(GL45.glCheckNamedFramebufferStatus(this.framebufferPointer,GL40.GL_FRAMEBUFFER) != GL40.GL_FRAMEBUFFER_UNDEFINED){
try {
TimeUnit.MILLISECONDS.sleep(1);
} catch (InterruptedException ex) {
@ -172,7 +171,7 @@ public class Framebuffer {
* @return The status
*/
public String getStatus(){
switch(glCheckNamedFramebufferStatus(this.framebufferPointer,GL40.GL_FRAMEBUFFER)){
switch(GL45.glCheckNamedFramebufferStatus(this.framebufferPointer,GL40.GL_FRAMEBUFFER)){
case GL40.GL_FRAMEBUFFER_UNDEFINED: {
return "The specified framebuffer is the default read or draw framebuffer, but the default framebuffer does not exist.";
}
@ -292,16 +291,23 @@ public class Framebuffer {
this.bind(openGLState);
GL40.glReadBuffer(GL40.GL_COLOR_ATTACHMENT0);
if(this.framebufferPointer == 0){
if(this.framebufferPointer == Framebuffer.DEFAULT_FRAMEBUFFER_POINTER){
//this is the default framebuffer, read from backbuffer because it is default
GL40.glReadBuffer(GL40.GL_BACK);
//set viewport
openGLState.glViewport(Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
} else if(attachTextureMap.containsKey(0)){
//this is NOT the default framebuffer, read from the first color attachment
GL40.glReadBuffer(GL40.GL_COLOR_ATTACHMENT0);
//set viewport
Texture texture = attachTextureMap.get(0);
width = texture.getWidth();
height = texture.getHeight();
openGLState.glViewport(width, height);
} else {
LoggerInterface.loggerRenderer.ERROR(new IllegalStateException("Tried to get pixels from a framebuffer that does not have a texture attached to attachment point 0."));
LoggerInterface.loggerRenderer.ERROR(new Error("Tried to get pixels from a framebuffer that does not have a texture attached to attachment point 0."));
}
//error check
@ -314,13 +320,12 @@ public class Framebuffer {
//get pixel data
try {
int bytesPerPixel = pixelFormatToBytes(pixelFormat,type);
int bytesPerPixel = Framebuffer.pixelFormatToBytes(pixelFormat,type);
int bufferSize = width * height * bytesPerPixel;
ByteBuffer buffer = BufferUtils.createByteBuffer(bufferSize);
if(buffer == null || buffer.limit() < bufferSize){
throw new Error("Failed to create buffer!");
}
openGLState.glViewport(width, height);
GL40.glReadPixels(offsetX, offsetY, width, height, pixelFormat, type, buffer);
Globals.renderingEngine.checkError();
//convert to a buffered images