Merge post-processing VBO logic

This commit is contained in:
James Seibel
2026-03-08 19:32:52 -05:00
parent da922a8c69
commit f745e9c51a
12 changed files with 83 additions and 222 deletions
@@ -207,7 +207,7 @@ public class McDebugObjectRenderer implements IMcDebugRenderer
// box vertex indexes
{
ByteBuffer buffer = ByteBuffer.allocateDirect(BOX_OUTLINE_INDICES.length * Integer.BYTES);
buffer.order(ByteOrder.LITTLE_ENDIAN);
buffer.order(ByteOrder.nativeOrder());
buffer.asIntBuffer().put(BOX_OUTLINE_INDICES);
buffer.rewind();
@@ -305,7 +305,7 @@ public class McDebugObjectRenderer implements IMcDebugRenderer
// upload data //
ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize);
buffer.order(ByteOrder.LITTLE_ENDIAN);
buffer.order(ByteOrder.nativeOrder());
buffer = Std140Builder.intoBuffer(buffer)
.putMat4f(transformMatrix.createJomlMatrix()) // uTransform
.putVec4(
@@ -446,7 +446,7 @@ public class McGenericObjectRenderer implements IMcGenericRenderer
// upload data //
ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize);
buffer.order(ByteOrder.LITTLE_ENDIAN);
buffer.order(ByteOrder.nativeOrder());
buffer = Std140Builder.intoBuffer(buffer)
.putIVec3(
LodUtil.getChunkPosFromDouble(boxGroup.getOriginBlockPos().x),
@@ -211,7 +211,7 @@ public class McLodRenderer implements IMcLodRenderer
.get();
ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize);
buffer.order(ByteOrder.LITTLE_ENDIAN);
buffer.order(ByteOrder.nativeOrder());
Std140Builder.intoBuffer(buffer)
.putInt(0) // uIsWhiteWorld
@@ -253,7 +253,7 @@ public class McLodRenderer implements IMcLodRenderer
// upload data //
ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize);
buffer.order(ByteOrder.LITTLE_ENDIAN);
buffer.order(ByteOrder.nativeOrder());
buffer = Std140Builder.intoBuffer(buffer)
.putFloat(dhNearClipDistance) // uClipDistance
.putFloat(Config.Client.Advanced.Graphics.NoiseTexture.noiseIntensity.get()) // uNoiseIntensity
@@ -34,6 +34,7 @@ import com.mojang.blaze3d.vertex.VertexFormat;
import com.seibel.distanthorizons.common.renderTest.helpers.DhVertexFormat;
import com.seibel.distanthorizons.common.renderTest.helpers.McTextureViewWrapper;
import com.seibel.distanthorizons.common.renderTest.helpers.McTextureWrapper;
import com.seibel.distanthorizons.common.renderTest.helpers.PostProcessHelper;
import com.seibel.distanthorizons.core.logging.DhLogger;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import net.minecraft.resources.Identifier;
@@ -59,6 +60,7 @@ public class DhApplyRenderer
protected GpuBuffer vboGpuBuffer;
protected final String name;
protected final String identifierName;
public String getIdentifierName() { return this.identifierName; }
@@ -85,7 +87,8 @@ public class DhApplyRenderer
String vertexShaderPath, String fragmentShaderPath
)
{
this.identifierName = "distanthorizons:"+name;
this.name = name;
this.identifierName = "distanthorizons:"+this.name;
this.blendFunction = blendFunction;
this.vertexShaderPath = vertexShaderPath;
@@ -98,7 +101,7 @@ public class DhApplyRenderer
GpuTexture destinationColorTexture)
{
this.createPipeline();
this.uploadVertexData();
this.vboGpuBuffer = PostProcessHelper.createAndUploadScreenVertexData(this.name);
this.sourceColorTextureViewWrapper.trySetup(sourceColorTexture);
this.sourceDepthTextureViewWrapper.trySetup(sourceDepthTexture);
@@ -147,38 +150,7 @@ public class DhApplyRenderer
}
this.pipeline = pipelineBuilder.build();
}
private void uploadVertexData()
{
// vertices for a full-screen quad
float[] vertices = new float[]
{
// PosX,Y,
-1f, -1f,
1f, -1f,
1f, 1f,
-1f, 1f,
};
Supplier<String> labelSupplier = () -> "distantHorizons:"+this.identifierName;
int usage = 8 | 32; // is this just using OpenGL VBO flags?, if so I can't find it, supposedly GlDevice on Mojang's side
int size = vertices.length * Float.BYTES;
this.vboGpuBuffer = GPU_DEVICE.createBuffer(labelSupplier, usage, size);
{
int offset = 0;
int length = vertices.length * Float.BYTES;
GpuBufferSlice bufferSlice = new GpuBufferSlice(this.vboGpuBuffer, offset, length);
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertices.length * Float.BYTES);
// Fill buffer with vertices.
byteBuffer.order(ByteOrder.nativeOrder());
byteBuffer.asFloatBuffer().put(vertices);
byteBuffer.rewind();
COMMAND_ENCODER.writeToBuffer(bufferSlice, byteBuffer);
}
}
//endregion
@@ -33,6 +33,7 @@ import com.mojang.blaze3d.vertex.VertexFormat;
import com.seibel.distanthorizons.common.renderTest.helpers.DhVertexFormat;
import com.seibel.distanthorizons.common.renderTest.helpers.McTextureViewWrapper;
import com.seibel.distanthorizons.common.renderTest.helpers.McTextureWrapper;
import com.seibel.distanthorizons.common.renderTest.helpers.PostProcessHelper;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.logging.DhLogger;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
@@ -112,38 +113,7 @@ public class McCopyRenderer
this.pipeline = pipelineBuilder.build();
// upload vertex data
{
// vertices for a full-screen quad
float[] vertices = new float[]
{
// PosX,Y,
-1f, -1f,
1f, -1f,
1f, 1f,
-1f, 1f,
};
Supplier<String> labelSupplier = () -> "distantHorizons:McCopyRenderer";
int usage = 8 | 32; // is this just using OpenGL VBO flags?, if so I can't find it, supposedly GlDevice on Mojang's side
int size = vertices.length * Float.BYTES;
this.vboGpuBuffer = gpuDevice.createBuffer(labelSupplier, usage, size);
{
int offset = 0;
int length = vertices.length * Float.BYTES;
GpuBufferSlice bufferSlice = new GpuBufferSlice(this.vboGpuBuffer, offset, length);
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertices.length * Float.BYTES);
// Fill buffer with vertices.
byteBuffer.order(ByteOrder.nativeOrder());
byteBuffer.asFloatBuffer().put(vertices);
byteBuffer.rewind();
commandEncoder.writeToBuffer(bufferSlice, byteBuffer);
}
}
this.vboGpuBuffer = PostProcessHelper.createAndUploadScreenVertexData("McCopyRenderer");
}
@@ -40,7 +40,7 @@ public abstract class AbstractUniformBufferWrapper implements IUniformBufferWrap
|| this.buffer.capacity() != size)
{
this.buffer = ByteBuffer.allocateDirect(size);
this.buffer.order(ByteOrder.LITTLE_ENDIAN);
this.buffer.order(ByteOrder.nativeOrder());
// GpuBuffer.USAGE_UNIFORM = 128
// GpuBuffer.USAGE_INDEX = 64
@@ -197,11 +197,11 @@ public class McInstancedVboContainer implements IInstancedVboContainer
int vertexBufferSize = this.vertexBufferSize();
this.vertexBuffer = ByteBuffer.allocateDirect(vertexBufferSize);
this.vertexBuffer.order(ByteOrder.LITTLE_ENDIAN);
this.vertexBuffer.order(ByteOrder.nativeOrder());
int indexBufferSize = this.indexBufferSize();
this.indexBuffer = ByteBuffer.allocateDirect(indexBufferSize);
this.indexBuffer.order(ByteOrder.LITTLE_ENDIAN);
this.indexBuffer.order(ByteOrder.nativeOrder());
}
this.vertexBuffer.position(0);
this.indexBuffer.position(0);
@@ -0,0 +1,55 @@
package com.seibel.distanthorizons.common.renderTest.helpers;
import com.mojang.blaze3d.buffers.GpuBuffer;
import com.mojang.blaze3d.buffers.GpuBufferSlice;
import com.mojang.blaze3d.systems.CommandEncoder;
import com.mojang.blaze3d.systems.GpuDevice;
import com.mojang.blaze3d.systems.RenderSystem;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.function.Supplier;
public class PostProcessHelper
{
private static final GpuDevice GPU_DEVICE = RenderSystem.getDevice();
private static final CommandEncoder COMMAND_ENCODER = GPU_DEVICE.createCommandEncoder();
// vertices for a full-screen quad
private static final float[] VERTICES = new float[]
{
// PosX,Y,
-1f, -1f,
1f, -1f,
1f, 1f,
-1f, 1f,
};
public static GpuBuffer createAndUploadScreenVertexData(String name)
{
Supplier<String> labelSupplier = () -> "distantHorizons:"+name;
// TODO
int usage = 8 | 32; // is this just using OpenGL VBO flags?, if so I can't find it, supposedly GlDevice on Mojang's side
int size = VERTICES.length * Float.BYTES;
GpuBuffer vboGpuBuffer = GPU_DEVICE.createBuffer(labelSupplier, usage, size);
{
int length = VERTICES.length * Float.BYTES;
GpuBufferSlice bufferSlice = new GpuBufferSlice(vboGpuBuffer, /*offset*/ 0, length);
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(VERTICES.length * Float.BYTES);
// Fill buffer with vertices.
byteBuffer.order(ByteOrder.nativeOrder());
byteBuffer.asFloatBuffer().put(VERTICES);
byteBuffer.rewind();
COMMAND_ENCODER.writeToBuffer(bufferSlice, byteBuffer);
}
return vboGpuBuffer;
}
}
@@ -33,12 +33,9 @@ import com.mojang.blaze3d.systems.RenderPass;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.textures.*;
import com.mojang.blaze3d.vertex.VertexFormat;
import com.seibel.distanthorizons.common.renderTest.helpers.DhVertexFormat;
import com.seibel.distanthorizons.common.renderTest.helpers.*;
import com.seibel.distanthorizons.common.renderTest.apply.McCopyRenderer;
import com.seibel.distanthorizons.common.renderTest.McLodRenderer;
import com.seibel.distanthorizons.common.renderTest.helpers.McTextureViewWrapper;
import com.seibel.distanthorizons.common.renderTest.helpers.McTextureWrapper;
import com.seibel.distanthorizons.common.renderTest.helpers.UniformHandler;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.logging.DhLogger;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
@@ -136,39 +133,7 @@ public class McFarFadeRenderer implements IMcFarFadeRenderer
this.pipeline = pipelineBuilder.build();
// upload vertex data
{
// vertices for a full-screen quad
float[] vertices = new float[]
{
// PosX,Y,
-1f, -1f,
1f, -1f,
1f, 1f,
-1f, 1f,
};
Supplier<String> labelSupplier = () -> "distantHorizons:McFadeRenderer";
int usage = 8 | 32; // is this just using OpenGL VBO flags?, if so I can't find it, supposedly GlDevice on Mojang's side
int size = vertices.length * Float.BYTES;
this.vboGpuBuffer = gpuDevice.createBuffer(labelSupplier, usage, size);
{
int offset = 0;
int length = vertices.length * Float.BYTES;
GpuBufferSlice bufferSlice = new GpuBufferSlice(this.vboGpuBuffer, offset, length);
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertices.length * Float.BYTES);
// Fill buffer with vertices.
byteBuffer.order(ByteOrder.nativeOrder());
byteBuffer.asFloatBuffer().put(vertices);
byteBuffer.rewind();
commandEncoder.writeToBuffer(bufferSlice, byteBuffer);
}
}
this.vboGpuBuffer = PostProcessHelper.createAndUploadScreenVertexData("McFadeRenderer");
}
//endregion
@@ -226,7 +191,7 @@ public class McFarFadeRenderer implements IMcFarFadeRenderer
// upload data //
ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize);
buffer.order(ByteOrder.LITTLE_ENDIAN);
buffer.order(ByteOrder.nativeOrder());
buffer = Std140Builder.intoBuffer(buffer)
.putFloat(fadeStartDistance) // uStartFadeBlockDistance
.putFloat(fadeEndDistance) // uEndFadeBlockDistance
@@ -44,6 +44,7 @@ import com.seibel.distanthorizons.common.renderTest.apply.DhApplyRenderer;
import com.seibel.distanthorizons.common.renderTest.helpers.DhVertexFormat;
import com.seibel.distanthorizons.common.renderTest.McLodRenderer;
import com.seibel.distanthorizons.common.renderTest.helpers.McTextureWrapper;
import com.seibel.distanthorizons.common.renderTest.helpers.PostProcessHelper;
import com.seibel.distanthorizons.common.renderTest.helpers.UniformHandler;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
@@ -151,39 +152,7 @@ public class McFogRenderer implements IMcFogRenderer
this.pipeline = pipelineBuilder.build();
// upload vertex data
{
// vertices for a full-screen quad
float[] vertices = new float[]
{
// PosX,Y,
-1f, -1f,
1f, -1f,
1f, 1f,
-1f, 1f,
};
Supplier<String> labelSupplier = () -> "distantHorizons:McFogRenderer";
int usage = 8 | 32; // is this just using OpenGL VBO flags?, if so I can't find it, supposedly GlDevice on Mojang's side
int size = vertices.length * Float.BYTES;
this.vboGpuBuffer = gpuDevice.createBuffer(labelSupplier, usage, size);
{
int offset = 0;
int length = vertices.length * Float.BYTES;
GpuBufferSlice bufferSlice = new GpuBufferSlice(this.vboGpuBuffer, offset, length);
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertices.length * Float.BYTES);
// Fill buffer with vertices.
byteBuffer.order(ByteOrder.nativeOrder());
byteBuffer.asFloatBuffer().put(vertices);
byteBuffer.rewind();
commandEncoder.writeToBuffer(bufferSlice, byteBuffer);
}
}
this.vboGpuBuffer = PostProcessHelper.createAndUploadScreenVertexData("McFogRenderer");
}
//endregion
@@ -302,7 +271,7 @@ public class McFogRenderer implements IMcFogRenderer
// upload data //
ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize);
buffer.order(ByteOrder.LITTLE_ENDIAN);
buffer.order(ByteOrder.nativeOrder());
buffer = Std140Builder.intoBuffer(buffer)
// fog uniforms
@@ -38,11 +38,8 @@ import com.mojang.blaze3d.textures.*;
import com.mojang.blaze3d.vertex.VertexFormat;
import com.seibel.distanthorizons.api.objects.math.DhApiMat4f;
import com.seibel.distanthorizons.common.renderTest.apply.DhApplyRenderer;
import com.seibel.distanthorizons.common.renderTest.helpers.DhVertexFormat;
import com.seibel.distanthorizons.common.renderTest.helpers.*;
import com.seibel.distanthorizons.common.renderTest.McLodRenderer;
import com.seibel.distanthorizons.common.renderTest.helpers.McTextureViewWrapper;
import com.seibel.distanthorizons.common.renderTest.helpers.McTextureWrapper;
import com.seibel.distanthorizons.common.renderTest.helpers.UniformHandler;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.logging.DhLogger;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
@@ -141,39 +138,7 @@ public class McSsaoRenderer implements IMcSsaoRenderer
this.pipeline = pipelineBuilder.build();
// upload vertex data
{
// vertices for a full-screen quad
float[] vertices = new float[]
{
// PosX,Y,
-1f, -1f,
1f, -1f,
1f, 1f,
-1f, 1f,
};
Supplier<String> labelSupplier = () -> "distantHorizons:McFadeRenderer";
int usage = 8 | 32; // is this just using OpenGL VBO flags?, if so I can't find it, supposedly GlDevice on Mojang's side
int size = vertices.length * Float.BYTES;
this.vboGpuBuffer = gpuDevice.createBuffer(labelSupplier, usage, size);
{
int offset = 0;
int length = vertices.length * Float.BYTES;
GpuBufferSlice bufferSlice = new GpuBufferSlice(this.vboGpuBuffer, offset, length);
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertices.length * Float.BYTES);
// Fill buffer with vertices.
byteBuffer.order(ByteOrder.nativeOrder());
byteBuffer.asFloatBuffer().put(vertices);
byteBuffer.rewind();
commandEncoder.writeToBuffer(bufferSlice, byteBuffer);
}
}
this.vboGpuBuffer = PostProcessHelper.createAndUploadScreenVertexData("McSsao");
}
//endregion
@@ -227,7 +192,7 @@ public class McSsaoRenderer implements IMcSsaoRenderer
// upload data //
ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize);
buffer.order(ByteOrder.LITTLE_ENDIAN);
buffer.order(ByteOrder.nativeOrder());
buffer = Std140Builder.intoBuffer(buffer)
.putInt(6) // uSampleCount
@@ -35,10 +35,7 @@ import com.mojang.blaze3d.textures.*;
import com.mojang.blaze3d.vertex.VertexFormat;
import com.seibel.distanthorizons.common.renderTest.McLodRenderer;
import com.seibel.distanthorizons.common.renderTest.apply.McCopyRenderer;
import com.seibel.distanthorizons.common.renderTest.helpers.DhVertexFormat;
import com.seibel.distanthorizons.common.renderTest.helpers.McTextureViewWrapper;
import com.seibel.distanthorizons.common.renderTest.helpers.McTextureWrapper;
import com.seibel.distanthorizons.common.renderTest.helpers.UniformHandler;
import com.seibel.distanthorizons.common.renderTest.helpers.*;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.logging.DhLogger;
@@ -139,39 +136,7 @@ public class McVanillaFadeRenderer implements IMcVanillaFadeRenderer
this.pipeline = pipelineBuilder.build();
// upload vertex data
{
// vertices for a full-screen quad
float[] vertices = new float[]
{
// PosX,Y,
-1f, -1f,
1f, -1f,
1f, 1f,
-1f, 1f,
};
Supplier<String> labelSupplier = () -> "distantHorizons:McFadeRenderer";
int usage = 8 | 32; // is this just using OpenGL VBO flags?, if so I can't find it, supposedly GlDevice on Mojang's side
int size = vertices.length * Float.BYTES;
this.vboGpuBuffer = gpuDevice.createBuffer(labelSupplier, usage, size);
{
int offset = 0;
int length = vertices.length * Float.BYTES;
GpuBufferSlice bufferSlice = new GpuBufferSlice(this.vboGpuBuffer, offset, length);
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertices.length * Float.BYTES);
// Fill buffer with vertices.
byteBuffer.order(ByteOrder.nativeOrder());
byteBuffer.asFloatBuffer().put(vertices);
byteBuffer.rewind();
commandEncoder.writeToBuffer(bufferSlice, byteBuffer);
}
}
this.vboGpuBuffer = PostProcessHelper.createAndUploadScreenVertexData("McFadeRenderer");
}
//endregion
@@ -245,7 +210,7 @@ public class McVanillaFadeRenderer implements IMcVanillaFadeRenderer
// upload data //
ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize);
buffer.order(ByteOrder.LITTLE_ENDIAN);
buffer.order(ByteOrder.nativeOrder());
buffer = Std140Builder.intoBuffer(buffer)
.putInt(Config.Client.Advanced.Debugging.lodOnlyMode.get() ? 1 : 0) // uOnlyRenderLods
.putFloat(fadeStartDistance) // uStartFadeBlockDistance