Working better

This commit is contained in:
mcrcortex
2024-07-15 19:34:22 +10:00
parent 5b5939855f
commit 4cbd7af3d0
9 changed files with 74 additions and 38 deletions

View File

@@ -115,21 +115,6 @@ public class VoxelCore {
System.out.println("Voxy core initialized");
}
private IRenderInterface<?> createRenderBackend() {
if (false) {
return new Gl46HierarchicalRenderer(this.modelManager);
} else if (true) {
return new Gl46MeshletsFarWorldRenderer(this.modelManager, VoxyConfig.CONFIG.geometryBufferSize, VoxyConfig.CONFIG.maxSections);
} else {
if (VoxyConfig.CONFIG.useMeshShaders()) {
return new NvMeshFarWorldRenderer(this.modelManager, VoxyConfig.CONFIG.geometryBufferSize, VoxyConfig.CONFIG.maxSections);
} else {
return new Gl46FarWorldRenderer(this.modelManager, VoxyConfig.CONFIG.geometryBufferSize, VoxyConfig.CONFIG.maxSections);
}
}
}
public void enqueueIngest(WorldChunk worldChunk) {
this.world.ingestService.enqueueIngest(worldChunk);
}
@@ -275,4 +260,20 @@ public class VoxelCore {
public WorldEngine getWorldEngine() {
return this.world;
}
private IRenderInterface<?> createRenderBackend() {
if (true) {
return new Gl46HierarchicalRenderer(this.modelManager);
} else if (true) {
return new Gl46MeshletsFarWorldRenderer(this.modelManager, VoxyConfig.CONFIG.geometryBufferSize, VoxyConfig.CONFIG.maxSections);
} else {
if (VoxyConfig.CONFIG.useMeshShaders()) {
return new NvMeshFarWorldRenderer(this.modelManager, VoxyConfig.CONFIG.geometryBufferSize, VoxyConfig.CONFIG.maxSections);
} else {
return new Gl46FarWorldRenderer(this.modelManager, VoxyConfig.CONFIG.geometryBufferSize, VoxyConfig.CONFIG.maxSections);
}
}
}
}

View File

@@ -62,17 +62,17 @@ public class Gl46HierarchicalRenderer implements IRenderInterface<Gl46Hierarchic
this.sectionSelector = new HierarchicalOcclusionRenderer(new INodeInteractor() {
@Override
public void watchUpdates(long pos) {
System.err.println("Watch: " + pos);
}
@Override
public void unwatchUpdates(long pos) {
System.err.println("Unwatch: " + pos);
}
@Override
public void requestMesh(long pos) {
System.err.println("Request: " + pos);
}
@Override
@@ -93,7 +93,7 @@ public class Gl46HierarchicalRenderer implements IRenderInterface<Gl46Hierarchic
{//Run the hierarchical selector over the buffer to generate the set of render sections
if (true) {//Run the hierarchical selector over the buffer to generate the set of render sections
var i = new int[1];
glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, i);
this.sectionSelector.doHierarchicalTraversalSelection(viewport, i[0], this.renderSections);

View File

@@ -6,11 +6,11 @@ public abstract class Viewport <A extends Viewport<A>> {
public int width;
public int height;
int frameId;
Matrix4f projection;
Matrix4f modelView;
double cameraX;
double cameraY;
double cameraZ;
public Matrix4f projection;
public Matrix4f modelView;
public double cameraX;
public double cameraY;
public double cameraZ;
protected Viewport() {
}

View File

@@ -6,13 +6,12 @@ import me.cortex.voxy.client.core.gl.shader.Shader;
import me.cortex.voxy.client.core.gl.shader.ShaderType;
import me.cortex.voxy.client.core.rendering.Gl46HierarchicalViewport;
import me.cortex.voxy.client.core.rendering.HiZBuffer;
import me.cortex.voxy.client.core.rendering.building.BuiltSection;
import me.cortex.voxy.client.core.rendering.hierarchical.INodeInteractor;
import me.cortex.voxy.client.core.rendering.hierarchical.MeshManager;
import me.cortex.voxy.client.core.rendering.hierarchical.NodeManager;
import me.cortex.voxy.client.core.rendering.util.UploadStream;
import java.util.function.Consumer;
import me.cortex.voxy.client.mixin.joml.AccessFrustumIntersection;
import net.minecraft.util.math.MathHelper;
import org.joml.Matrix4f;
import org.joml.Vector3f;
import org.lwjgl.system.MemoryUtil;
import static org.lwjgl.opengl.GL30.glBindBufferBase;
import static org.lwjgl.opengl.GL33.glBindSampler;
@@ -44,14 +43,32 @@ public class HierarchicalOcclusionRenderer {
.compile();
}
private void uploadUniform() {
private void uploadUniform(Gl46HierarchicalViewport viewport) {
long ptr = UploadStream.INSTANCE.upload(this.uniformBuffer, 0, 1024);
int sx = MathHelper.floor(viewport.cameraX)>>5;
int sy = MathHelper.floor(viewport.cameraY)>>5;
int sz = MathHelper.floor(viewport.cameraZ)>>5;
new Matrix4f(viewport.projection).mul(viewport.modelView).getToAddress(ptr); ptr += 4*4*4;
MemoryUtil.memPutInt(ptr, sx); ptr += 4;
MemoryUtil.memPutInt(ptr, sy); ptr += 4;
MemoryUtil.memPutInt(ptr, sz); ptr += 4;
MemoryUtil.memPutInt(ptr, viewport.width); ptr += 4;
var innerTranslation = new Vector3f((float) (viewport.cameraX-(sx<<5)), (float) (viewport.cameraY-(sy<<5)), (float) (viewport.cameraZ-(sz<<5)));
innerTranslation.getToAddress(ptr); ptr += 4*3;
MemoryUtil.memPutInt(ptr, viewport.height); ptr += 4;
MemoryUtil.memPutInt(ptr, NodeManager.REQUEST_QUEUE_SIZE); ptr += 4;
MemoryUtil.memPutInt(ptr, 1000000); ptr += 4;
}
public void doHierarchicalTraversalSelection(Gl46HierarchicalViewport viewport, int depthBuffer, GlBuffer renderSelectionResult) {
this.uploadUniform();
this.uploadUniform(viewport);
this.nodeManager.upload();
UploadStream.INSTANCE.commit();
//Make hiz
this.hiz.buildMipChain(depthBuffer, viewport.width, viewport.height);
@@ -75,6 +92,8 @@ public class HierarchicalOcclusionRenderer {
glDispatchCompute(1,1,1);
}
glBindSampler(0, 0);
glBindTextureUnit(0, 0);
this.nodeManager.download();
}

View File

@@ -129,7 +129,7 @@ public class NodeManager {
Arrays.fill(this.localNodeData, 0);
this.setNodePosition(0, WorldEngine.getWorldSectionId(0, 0,5,0));
this.setNodePosition(0, WorldEngine.getWorldSectionId(2, 0,0,0));
this.setChildPtr(0, NODE_MSK, 0);
this.setMeshId(0, MESH_MSK);
this.pushNode(0);
@@ -165,7 +165,7 @@ public class NodeManager {
private boolean isLeafNode(int node) {
//TODO: maybe make this flag based instead of checking the child ptr?
return this.getNodeChildPtr(node) != NODE_MSK;
return this.getNodeChildPtr(node) == NODE_MSK;
}
//Its ment to return if the node is just an empty mesh or if all the children are also empty

View File

@@ -10,7 +10,7 @@ public class MarkedObjectList<T> {
private final Int2ObjectFunction<T[]> arrayGenerator;
private final Supplier<T> nullSupplier;
private final HierarchicalBitSet bitSet = new HierarchicalBitSet(-1);
private final HierarchicalBitSet bitSet = new HierarchicalBitSet();
private T[] objects;//Should maybe make a getter function instead
public MarkedObjectList(Int2ObjectFunction<T[]> arrayGenerator, Supplier<T> nullSupplier) {

View File

@@ -15,6 +15,10 @@ public class HierarchicalBitSet {
}
}
public HierarchicalBitSet() {
this(1<<(6*4));
}
public int allocateNext() {
if (this.A==-1) {
return -1;

View File

@@ -50,14 +50,25 @@ void setupScreenspace(in UnpackedNode node) {
vec4 pPoint = (VP*vec4(vec3((i&1)!=0,(i&2)!=0,(i&4)!=0)*32,1));//Size of section is 32x32x32 (need to change it to a bounding box in the future)
pPoint += base;
vec3 point = pPoint.xyz/pPoint.w;
//TODO: CLIP TO VIEWPORT
minBB = min(minBB, point);
maxBB = max(maxBB, point);
}
//printf("Screenspace MIN: %f, %f, %f MAX: %f, %f, %f", minBB.x,minBB.y,minBB.z, maxBB.x,maxBB.y,maxBB.z);
size = maxBB.xy - minBB.xy;
}
//Checks if the node is implicitly culled (outside frustum)
bool outsideFrustum() {
return any(lessThanEqual(maxBB, vec3(-1f, -1f, 0f))) || any(lessThanEqual(vec3(1f, 1f, 1f), minBB));
}
bool isCulledByHiz() {
if (minBB.z < 0) {//Minpoint is behind the camera, its always going to pass
return false;
}
vec2 ssize = size.xy * vec2(ivec2(screenW, screenH));
float miplevel = ceil(log2(max(max(ssize.x, ssize.y),1)));
vec2 midpoint = (maxBB.xy + minBB.xy)*0.5;
@@ -66,5 +77,6 @@ bool isCulledByHiz() {
//Returns if we should decend into its children or not
bool shouldDecend() {
return (size.x*size.y) > (64*64F);
//printf("Screen area %f: %f, %f", (size.x*size.y*float(screenW)*float(screenH)), float(screenW), float(screenH));
return (size.x*size.y*screenW*screenH) > (64*64F);
}

View File

@@ -77,8 +77,8 @@ layout(binding = 2, std430) restrict buffer QueueData {
void addRequest(inout UnpackedNode node) {
printf("requested");
if (!hasRequested(node)) {
printf("requested");
//TODO: maybe try using only 1 variable and it being <0 being bad
if (requestQueueIndex < requestQueueMaxSize) {
//Mark node as having a request submitted to prevent duplicate submissions
@@ -113,7 +113,7 @@ void main() {
//debugDumpNode(node);
if (isCulledByHiz()) {
if (outsideFrustum() || isCulledByHiz()) {
//printf("HizCulled");
//We are done here, dont do any more, the issue is the shader barriers maybe
// its culled, maybe just mark it as culled?