Более аккуратное восстановление состояния

This commit is contained in:
2026-08-11 11:10:26 +04:00
parent 73045aec4d
commit 2521366109
2 changed files with 65 additions and 35 deletions
@@ -39,6 +39,7 @@ public final class FullscreenQuad {
vbo = GL15.glGenBuffers(); vbo = GL15.glGenBuffers();
int previous = glGetInteger(GL_VERTEX_ARRAY_BINDING); int previous = glGetInteger(GL_VERTEX_ARRAY_BINDING);
int previousArrayBuffer = GL11.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING);
GL30.glBindVertexArray(vao); GL30.glBindVertexArray(vao);
@@ -56,6 +57,7 @@ public final class FullscreenQuad {
); );
GL30.glBindVertexArray(previous); GL30.glBindVertexArray(previous);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, previousArrayBuffer);
} }
public static void draw() { public static void draw() {
@@ -41,6 +41,10 @@ public class PostProcessingManager {
private static final FloatBuffer projectionBuffer = BufferUtils.createFloatBuffer(16); private static final FloatBuffer projectionBuffer = BufferUtils.createFloatBuffer(16);
private static final FloatBuffer inverseProjectionBuffer = BufferUtils.createFloatBuffer(16); private static final FloatBuffer inverseProjectionBuffer = BufferUtils.createFloatBuffer(16);
private static final int[] previousViewport = new int[4];
private static final int[] previousTexture2D = new int[5];
private static final int[] previousTexture3D = new int[5];
/* /*
* Uniform locations - Raymarch Program * Uniform locations - Raymarch Program
*/ */
@@ -171,11 +175,15 @@ public class PostProcessingManager {
scaledWidth = (int)(width * scale); scaledWidth = (int)(width * scale);
scaledHeight = (int)(height * scale); scaledHeight = (int)(height * scale);
int previousFramebuffer = GL11.glGetInteger(GL30.GL_FRAMEBUFFER_BINDING);
int previousActiveTexture = GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE);
GL13.glActiveTexture(GL13.GL_TEXTURE0);
int previousTexture0 = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
scaledFBO = GL30.glGenFramebuffers(); scaledFBO = GL30.glGenFramebuffers();
GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, scaledFBO); GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, scaledFBO);
scaledTexture = GL11.glGenTextures(); scaledTexture = GL11.glGenTextures();
GL13.glActiveTexture(GL13.GL_TEXTURE0);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, scaledTexture); GL11.glBindTexture(GL11.GL_TEXTURE_2D, scaledTexture);
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL30.GL_RGBA16F, scaledWidth, scaledHeight, 0, GL11.GL_RGBA, GL11.GL_FLOAT, 0); GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL30.GL_RGBA16F, scaledWidth, scaledHeight, 0, GL11.GL_RGBA, GL11.GL_FLOAT, 0);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
@@ -196,7 +204,9 @@ public class PostProcessingManager {
GL30.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT1, GL11.GL_TEXTURE_2D, scaledDepthTexture, 0); GL30.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT1, GL11.GL_TEXTURE_2D, scaledDepthTexture, 0);
GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); GL11.glBindTexture(GL11.GL_TEXTURE_2D, previousTexture0);
GL13.glActiveTexture(previousActiveTexture);
GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, previousFramebuffer);
} }
public static void render(float tickDelta) { public static void render(float tickDelta) {
@@ -208,6 +218,21 @@ public class PostProcessingManager {
if (client.world == null) if (client.world == null)
return; return;
int previousProgram = GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM);
int previousActiveTexture = GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE);
int previousDrawFramebuffer = GL11.glGetInteger(GL30.GL_DRAW_FRAMEBUFFER_BINDING);
int previousReadFramebuffer = GL11.glGetInteger(GL30.GL_READ_FRAMEBUFFER_BINDING);
int previousDrawBuffer = GL11.glGetInteger(GL11.GL_DRAW_BUFFER);
GL11.glGetIntegerv(GL11.GL_VIEWPORT, previousViewport);
for (int unit = 0; unit <= 4; unit++) {
GL13.glActiveTexture(GL13.GL_TEXTURE0 + unit);
previousTexture2D[unit] = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
previousTexture3D[unit] = GL11.glGetInteger(GL12.GL_TEXTURE_BINDING_3D);
}
GL13.glActiveTexture(previousActiveTexture);
try {
Framebuffer framebuffer = client.getFramebuffer(); Framebuffer framebuffer = client.getFramebuffer();
int width = framebuffer.textureWidth; int width = framebuffer.textureWidth;
@@ -227,6 +252,7 @@ public class PostProcessingManager {
DepthCopy.init(width, height); DepthCopy.init(width, height);
DepthCopy.copy(width, height); DepthCopy.copy(width, height);
updateProjectionMatrices();
renderDepthDownsample(width, height); renderDepthDownsample(width, height);
@@ -237,7 +263,19 @@ public class PostProcessingManager {
renderComposite(framebuffer, width, height); renderComposite(framebuffer, width, height);
GL30.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, 0); GL30.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, 0);
GL13.glActiveTexture(GL13.GL_TEXTURE0); } finally {
for (int unit = 4; unit >= 0; unit--) {
GL13.glActiveTexture(GL13.GL_TEXTURE0 + unit);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, previousTexture2D[unit]);
GL11.glBindTexture(GL12.GL_TEXTURE_3D, previousTexture3D[unit]);
}
GL13.glActiveTexture(previousActiveTexture);
GL20.glUseProgram(previousProgram);
GL30.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, previousDrawFramebuffer);
GL30.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, previousReadFramebuffer);
GL11.glDrawBuffer(previousDrawBuffer);
GL11.glViewport(previousViewport[0], previousViewport[1], previousViewport[2], previousViewport[3]);
}
} }
private static void renderDepthDownsample(int width, int height) { private static void renderDepthDownsample(int width, int height) {
@@ -259,7 +297,6 @@ public class PostProcessingManager {
FullscreenQuad.draw(); FullscreenQuad.draw();
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
depthDownsampleProgram.unbind(); depthDownsampleProgram.unbind();
} }
@@ -306,7 +343,6 @@ public class PostProcessingManager {
FogSystem.ringChunkOffsetZ() * FogWorldVolume.CHUNK_SIZE); FogSystem.ringChunkOffsetZ() * FogWorldVolume.CHUNK_SIZE);
// Матрицы // Матрицы
updateProjectionMatrices();
GL20.glUniformMatrix4fv(rm_projectionLocation, false, projectionBuffer); GL20.glUniformMatrix4fv(rm_projectionLocation, false, projectionBuffer);
GL20.glUniformMatrix4fv(rm_inverseProjectionLocation, false, inverseProjectionBuffer); GL20.glUniformMatrix4fv(rm_inverseProjectionLocation, false, inverseProjectionBuffer);
GL20.glUniformMatrix4fv(rm_viewLocation, false, viewBuffer); GL20.glUniformMatrix4fv(rm_viewLocation, false, viewBuffer);
@@ -372,7 +408,6 @@ public class PostProcessingManager {
GL20.glUniform1i(comp_scaledDepthSamplerLocation, 3); GL20.glUniform1i(comp_scaledDepthSamplerLocation, 3);
// Матрицы для линеаризации depth // Матрицы для линеаризации depth
updateProjectionMatrices();
GL20.glUniformMatrix4fv(comp_inverseProjectionLocation, false, inverseProjectionBuffer); GL20.glUniformMatrix4fv(comp_inverseProjectionLocation, false, inverseProjectionBuffer);
// Screen size // Screen size
@@ -382,14 +417,7 @@ public class PostProcessingManager {
FullscreenQuad.draw(); FullscreenQuad.draw();
// Очистка // Очистка
GL13.glActiveTexture(GL13.GL_TEXTURE3); // restore state once in render() finalizer
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
GL13.glActiveTexture(GL13.GL_TEXTURE2);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
GL13.glActiveTexture(GL13.GL_TEXTURE1);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
GL13.glActiveTexture(GL13.GL_TEXTURE0);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
compositeProgram.unbind(); compositeProgram.unbind();
} }