diff --git a/src/main/java/net/vulkanmod/config/Config.java b/src/main/java/net/vulkanmod/config/Config.java index 2ba064652..690eaef38 100644 --- a/src/main/java/net/vulkanmod/config/Config.java +++ b/src/main/java/net/vulkanmod/config/Config.java @@ -21,6 +21,8 @@ public class Config { public boolean uniqueOpaqueLayer = true; public boolean entityCulling = true; public int device = -1; + public boolean animations = true; + public boolean renderSky = true; private static Path path; diff --git a/src/main/java/net/vulkanmod/config/Options.java b/src/main/java/net/vulkanmod/config/Options.java index cad259c4a..5b61daa95 100644 --- a/src/main/java/net/vulkanmod/config/Options.java +++ b/src/main/java/net/vulkanmod/config/Options.java @@ -154,6 +154,12 @@ public static Option[] getGraphicsOpts() { new RangeOption("Entity Distance", 50, 500, 25, value -> minecraftOptions.entityDistanceScaling().set(value * 0.01), () -> minecraftOptions.entityDistanceScaling().get().intValue() * 100), + new SwitchOption("Animations", + value -> config.animations = value, + () -> config.animations), + new SwitchOption("Render Sky", + value -> config.renderSky = value, + () -> config.renderSky), new CyclingOption<>("Mipmap Levels", new Integer[]{0, 1, 2, 3, 4}, value -> Component.nullToEmpty(value.toString()), diff --git a/src/main/java/net/vulkanmod/mixin/render/RenderSystemMixin.java b/src/main/java/net/vulkanmod/mixin/render/RenderSystemMixin.java index d1ade0713..93d21b881 100644 --- a/src/main/java/net/vulkanmod/mixin/render/RenderSystemMixin.java +++ b/src/main/java/net/vulkanmod/mixin/render/RenderSystemMixin.java @@ -357,13 +357,13 @@ public static void _setShaderLights(Vector3f p_157174_, Vector3f p_157175_) { shaderLightDirections[0] = p_157174_; shaderLightDirections[1] = p_157175_; - VRenderSystem.lightDirection0.buffer.putFloat(0, p_157174_.x()); - VRenderSystem.lightDirection0.buffer.putFloat(4, p_157174_.y()); - VRenderSystem.lightDirection0.buffer.putFloat(8, p_157174_.z()); + VRenderSystem.lightDirection0.buffer().putFloat(0, p_157174_.x()); + VRenderSystem.lightDirection0.buffer().putFloat(4, p_157174_.y()); + VRenderSystem.lightDirection0.buffer().putFloat(8, p_157174_.z()); - VRenderSystem.lightDirection1.buffer.putFloat(0, p_157175_.x()); - VRenderSystem.lightDirection1.buffer.putFloat(4, p_157175_.y()); - VRenderSystem.lightDirection1.buffer.putFloat(8, p_157175_.z()); + VRenderSystem.lightDirection1.buffer().putFloat(0, p_157175_.x()); + VRenderSystem.lightDirection1.buffer().putFloat(4, p_157175_.y()); + VRenderSystem.lightDirection1.buffer().putFloat(8, p_157175_.z()); } /** diff --git a/src/main/java/net/vulkanmod/mixin/render/vertex/VertexBufferM.java b/src/main/java/net/vulkanmod/mixin/render/vertex/VertexBufferM.java index dc5b140dd..3b445e946 100644 --- a/src/main/java/net/vulkanmod/mixin/render/vertex/VertexBufferM.java +++ b/src/main/java/net/vulkanmod/mixin/render/vertex/VertexBufferM.java @@ -3,6 +3,7 @@ import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.VertexBuffer; import net.minecraft.client.renderer.ShaderInstance; +import net.vulkanmod.Initializer; import net.vulkanmod.render.VBO; import org.joml.Matrix4f; import org.spongepowered.asm.mixin.Mixin; @@ -57,7 +58,8 @@ public void upload(BufferBuilder.RenderedBuffer buffer) { */ @Overwrite public void drawWithShader(Matrix4f viewMatrix, Matrix4f projectionMatrix, ShaderInstance shader) { - vbo.drawWithShader(viewMatrix, projectionMatrix, shader); + if(Initializer.CONFIG.renderSky) + vbo.drawWithShader(viewMatrix, projectionMatrix, shader); } /** diff --git a/src/main/java/net/vulkanmod/mixin/texture/MTextureManager.java b/src/main/java/net/vulkanmod/mixin/texture/MTextureManager.java index 76c7efc27..752fb5a35 100644 --- a/src/main/java/net/vulkanmod/mixin/texture/MTextureManager.java +++ b/src/main/java/net/vulkanmod/mixin/texture/MTextureManager.java @@ -5,6 +5,7 @@ import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.client.renderer.texture.Tickable; import net.minecraft.resources.ResourceLocation; +import net.vulkanmod.Initializer; import net.vulkanmod.render.texture.SpriteUtil; import net.vulkanmod.vulkan.DeviceManager; import net.vulkanmod.vulkan.Renderer; @@ -29,7 +30,7 @@ public abstract class MTextureManager { */ @Overwrite public void tick() { - if(Renderer.skipRendering) + if(Renderer.skipRendering|| !Initializer.CONFIG.animations) return; //Debug D diff --git a/src/main/java/net/vulkanmod/render/PipelineManager.java b/src/main/java/net/vulkanmod/render/PipelineManager.java index 79b04ce1d..3a30039f0 100644 --- a/src/main/java/net/vulkanmod/render/PipelineManager.java +++ b/src/main/java/net/vulkanmod/render/PipelineManager.java @@ -3,73 +3,81 @@ import com.mojang.blaze3d.vertex.VertexFormat; import net.minecraft.client.renderer.RenderType; import net.vulkanmod.Initializer; -import net.vulkanmod.render.chunk.build.ThreadBuilderPack; import net.vulkanmod.render.vertex.CustomVertexFormat; +import net.vulkanmod.render.vertex.TerrainRenderType; import net.vulkanmod.vulkan.shader.GraphicsPipeline; import net.vulkanmod.vulkan.shader.Pipeline; +import net.vulkanmod.vulkan.shader.SPIRVUtils; import java.util.function.Function; +import static net.vulkanmod.vulkan.shader.SPIRVUtils.compileShaderAbsoluteFile; + public abstract class PipelineManager { + private static final String resourcePath1 = SPIRVUtils.class.getResource("/assets/vulkanmod/shaders/").toExternalForm(); public static VertexFormat TERRAIN_VERTEX_FORMAT; public static void setTerrainVertexFormat(VertexFormat format) { TERRAIN_VERTEX_FORMAT = format; } - static GraphicsPipeline terrainIndirectShader; - public static GraphicsPipeline terrainDirectShader; - public static GraphicsPipeline fastBlitPipeline; + static GraphicsPipeline terrainShaderEarlyZ, terrainShader, fastBlitPipeline; - private static Function shaderGetter; + private static Function shaderGetter; public static void init() { setTerrainVertexFormat(CustomVertexFormat.COMPRESSED_TERRAIN); createBasicPipelines(); setDefaultShader(); - ThreadBuilderPack.defaultTerrainBuilderConstructor(); + } public static void setDefaultShader() { - setShaderGetter(renderType -> Initializer.CONFIG.indirectDraw ? terrainIndirectShader : terrainDirectShader); + setShaderGetter(renderType -> renderType == TerrainRenderType.TRANSLUCENT ? terrainShaderEarlyZ : terrainShader); } private static void createBasicPipelines() { - terrainIndirectShader = createPipeline("terrain_indirect", CustomVertexFormat.COMPRESSED_TERRAIN); - terrainDirectShader = createPipeline("terrain_direct", CustomVertexFormat.COMPRESSED_TERRAIN); - fastBlitPipeline = createPipeline("blit", CustomVertexFormat.NONE); + terrainShaderEarlyZ = createPipeline("terrain","terrain", "terrain_Z", CustomVertexFormat.COMPRESSED_TERRAIN); + terrainShader = createPipeline("terrain", "terrain", "terrain", CustomVertexFormat.COMPRESSED_TERRAIN); + fastBlitPipeline = createPipeline("blit", "blit", "blit", CustomVertexFormat.NONE); } - private static GraphicsPipeline createPipeline(String name, VertexFormat vertexFormat) { - String path = String.format("basic/%s/%s", name, name); + private static GraphicsPipeline createPipeline(String baseName, String vertName, String fragName,VertexFormat vertexFormat) { + String pathB = String.format("basic/%s/%s", baseName, baseName); + String pathV = String.format("basic/%s/%s", baseName, vertName); + String pathF = String.format("basic/%s/%s", baseName, fragName); - Pipeline.Builder pipelineBuilder = new Pipeline.Builder(vertexFormat, path); + Pipeline.Builder pipelineBuilder = new Pipeline.Builder(vertexFormat, pathB); pipelineBuilder.parseBindingsJSON(); - pipelineBuilder.compileShaders(); + + + SPIRVUtils.SPIRV vertShaderSPIRV = compileShaderAbsoluteFile(String.format("%s%s.vsh", resourcePath1, pathV), SPIRVUtils.ShaderKind.VERTEX_SHADER); + SPIRVUtils.SPIRV fragShaderSPIRV = compileShaderAbsoluteFile(String.format("%s%s.fsh", resourcePath1, pathF), SPIRVUtils.ShaderKind.FRAGMENT_SHADER); + pipelineBuilder.compileShaders2(vertShaderSPIRV, fragShaderSPIRV); + return pipelineBuilder.createGraphicsPipeline(); } - - public static GraphicsPipeline getTerrainShader(RenderType renderType) { + public static GraphicsPipeline getTerrainShader(TerrainRenderType renderType) { return shaderGetter.apply(renderType); } - public static void setShaderGetter(Function consumer) { + public static void setShaderGetter(Function consumer) { shaderGetter = consumer; } public static GraphicsPipeline getTerrainDirectShader(RenderType renderType) { - return terrainDirectShader; + return terrainShader; } public static GraphicsPipeline getTerrainIndirectShader(RenderType renderType) { - return terrainIndirectShader; + return terrainShaderEarlyZ; } public static GraphicsPipeline getFastBlitPipeline() { return fastBlitPipeline; } public static void destroyPipelines() { - terrainIndirectShader.cleanUp(); - terrainDirectShader.cleanUp(); + terrainShaderEarlyZ.cleanUp(); + terrainShader.cleanUp(); fastBlitPipeline.cleanUp(); } } diff --git a/src/main/java/net/vulkanmod/render/chunk/ChunkArea.java b/src/main/java/net/vulkanmod/render/chunk/ChunkArea.java index 228dfab7b..237f06dd5 100644 --- a/src/main/java/net/vulkanmod/render/chunk/ChunkArea.java +++ b/src/main/java/net/vulkanmod/render/chunk/ChunkArea.java @@ -1,28 +1,18 @@ package net.vulkanmod.render.chunk; import net.minecraft.core.BlockPos; -import net.vulkanmod.render.chunk.util.ResettableQueue; import net.vulkanmod.render.chunk.util.StaticQueue; +import net.vulkanmod.render.vertex.TerrainRenderType; import org.joml.FrustumIntersection; import org.joml.Vector3i; import java.util.Arrays; -public class ChunkArea { - public final int index; - private final byte[] inFrustum = new byte[64]; +public record ChunkArea(int index, byte[] inFrustum, Vector3i position, DrawBuffers drawBuffers) +{ - final Vector3i position; - - DrawBuffers drawBuffers; - - //Help JIT optimisations by hardcoding the queue size to the max possible ChunkArea limit - final StaticQueue sectionQueue = new StaticQueue<>(512); - - public ChunkArea(int i, Vector3i origin) { - this.index = i; - this.position = origin; - this.drawBuffers = new DrawBuffers(); + public ChunkArea(int i, Vector3i origin, int minHeight) { + this(i, new byte[64], origin, new DrawBuffers(i, origin, minHeight)); } public void updateFrustum(VFrustum frustum) { @@ -120,16 +110,16 @@ public DrawBuffers getDrawBuffers() { return this.drawBuffers; } - private void allocateDrawBuffers() { - this.drawBuffers = new DrawBuffers(); - } +// private void allocateDrawBuffers() { +// this.drawBuffers = new DrawBuffers(this.index, this.position); +// } - public void addSection(RenderSection section) { - this.sectionQueue.add(section); + public void addSection(RenderSection section, TerrainRenderType renderType) { + this.drawBuffers.addDrawCommands(renderType, section.getDrawParameters(renderType)); } public void resetQueue() { - this.sectionQueue.clear(); + this.drawBuffers.clear(); } public void setPosition(int x, int y, int z) { diff --git a/src/main/java/net/vulkanmod/render/chunk/ChunkAreaManager.java b/src/main/java/net/vulkanmod/render/chunk/ChunkAreaManager.java index aa9638a40..b145da4fa 100644 --- a/src/main/java/net/vulkanmod/render/chunk/ChunkAreaManager.java +++ b/src/main/java/net/vulkanmod/render/chunk/ChunkAreaManager.java @@ -45,7 +45,7 @@ public ChunkAreaManager(int width, int height, int minHeight) { for(int l = 0; l < this.xzSize; ++l) { int i1 = this.getAreaIndex(j, k, l); Vector3i vector3i = new Vector3i(j << BASE_SH_XZ + 4, k << BASE_SH_Y + 4, l << BASE_SH_XZ + 4); - this.chunkAreasArr[i1] = new ChunkArea(i1, vector3i); + this.chunkAreasArr[i1] = new ChunkArea(i1, vector3i, minHeight); } } } @@ -180,7 +180,7 @@ public void updateFrustumVisibility(VFrustum frustum) { public void resetQueues() { for(ChunkArea chunkArea : this.chunkAreasArr) { - chunkArea.sectionQueue.clear(); + chunkArea.drawBuffers().clear(); } } diff --git a/src/main/java/net/vulkanmod/render/chunk/DrawBuffers.java b/src/main/java/net/vulkanmod/render/chunk/DrawBuffers.java index ca710d669..3aacc19a7 100644 --- a/src/main/java/net/vulkanmod/render/chunk/DrawBuffers.java +++ b/src/main/java/net/vulkanmod/render/chunk/DrawBuffers.java @@ -1,19 +1,25 @@ package net.vulkanmod.render.chunk; -import net.minecraft.client.renderer.RenderType; import net.vulkanmod.render.PipelineManager; import net.vulkanmod.render.chunk.build.UploadBuffer; import net.vulkanmod.render.chunk.util.StaticQueue; import net.vulkanmod.render.vertex.TerrainRenderType; import net.vulkanmod.vulkan.Renderer; +import net.vulkanmod.vulkan.VRenderSystem; import net.vulkanmod.vulkan.memory.IndirectBuffer; import net.vulkanmod.vulkan.shader.Pipeline; +import net.vulkanmod.vulkan.util.VUtil; +import org.joml.Matrix4f; +import org.joml.Vector3i; import org.lwjgl.system.MemoryStack; import org.lwjgl.system.MemoryUtil; import org.lwjgl.vulkan.VkCommandBuffer; import java.nio.ByteBuffer; +import java.nio.FloatBuffer; import java.nio.LongBuffer; +import java.util.EnumMap; +import java.util.Set; import static org.lwjgl.vulkan.VK10.*; @@ -21,21 +27,36 @@ public class DrawBuffers { private static final int VERTEX_SIZE = PipelineManager.TERRAIN_VERTEX_FORMAT.getVertexSize(); private static final int INDEX_SIZE = Short.BYTES; + public final int index; + private final Vector3i origin; + private final int minHeight; private boolean allocated = false; AreaBuffer vertexBuffer; AreaBuffer indexBuffer; + //Help JIT optimisations by hardcoding the queue size to the max possible ChunkArea limit +// final StaticQueue sectionQueue = new StaticQueue<>(512); + private final EnumMap> sectionQueues = new EnumMap<>(TerrainRenderType.class); + + public DrawBuffers(int index, Vector3i origin, int minHeight) { + + this.index = index; + this.origin = origin; + this.minHeight = minHeight; + } + public void allocateBuffers() { this.vertexBuffer = new AreaBuffer(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, 3500000, VERTEX_SIZE); - this.indexBuffer = new AreaBuffer(VK_BUFFER_USAGE_INDEX_BUFFER_BIT, 1000000, INDEX_SIZE); + TerrainRenderType.getActiveLayers().forEach(renderType -> sectionQueues.put(renderType, new StaticQueue<>(512))); this.allocated = true; } - public DrawParameters upload(UploadBuffer buffer, DrawParameters drawParameters) { + public void upload(int xOffset, int yOffset, int zOffset, UploadBuffer buffer, DrawParameters drawParameters) { int vertexOffset = drawParameters.vertexOffset; int firstIndex = 0; + drawParameters.baseInstance = encodeSectionOffset(xOffset, yOffset, zOffset); if(!buffer.indexOnly) { this.vertexBuffer.upload(buffer.getVertexBuffer(), drawParameters.vertexBufferSegment); @@ -49,6 +70,8 @@ public DrawParameters upload(UploadBuffer buffer, DrawParameters drawParameters) } if(!buffer.autoIndices) { + if (this.indexBuffer==null) + this.indexBuffer = new AreaBuffer(VK_BUFFER_USAGE_INDEX_BUFFER_BIT, 1000000, INDEX_SIZE); this.indexBuffer.upload(buffer.getIndexBuffer(), drawParameters.indexBufferSegment); // drawParameters.firstIndex = drawParameters.indexBufferSegment.getOffset() / INDEX_SIZE; firstIndex = drawParameters.indexBufferSegment.getOffset() / INDEX_SIZE; @@ -65,37 +88,60 @@ public DrawParameters upload(UploadBuffer buffer, DrawParameters drawParameters) buffer.release(); - return drawParameters; +// return drawParameters; } - public int buildDrawBatchesIndirect(IndirectBuffer indirectBuffer, ChunkArea chunkArea, RenderType renderType, double camX, double camY, double camZ) { + + private boolean renderTypeEmpty(TerrainRenderType r) { + return this.sectionQueues.get(r).size()==0; + } + + private int encodeSectionOffset(int xOffset, int yOffset, int zOffset) { + final int xOffset1 = (xOffset & 127); + final int zOffset1 = (zOffset & 127); + final int yOffset1 = (yOffset-this.minHeight & 127); + return yOffset1 << 16 | zOffset1 << 8 | xOffset1; + } + + private void updateChunkAreaOrigin(double camX, double camY, double camZ, VkCommandBuffer commandBuffer, long layout, FloatBuffer mPtr) { + + float x = (float)(camX-(this.origin.x)); + float y = (float)(camY-(this.origin.y)); + float z = (float)(camZ-(this.origin.z)); + + Matrix4f MVP = new Matrix4f().set(VRenderSystem.MVP.buffer().asFloatBuffer()); + Matrix4f MV = new Matrix4f().set(VRenderSystem.modelViewMatrix.buffer().asFloatBuffer()); + + MVP.translate(-x, -y, -z).get(mPtr); + MV.translate(-x, -y, -z).get(16,mPtr); + + vkCmdPushConstants(commandBuffer, layout, VK_SHADER_STAGE_VERTEX_BIT, 0, mPtr); + } + + public int buildDrawBatchesIndirect(IndirectBuffer indirectBuffer, TerrainRenderType terrainRenderType, double camX, double camY, double camZ, long layout) { int stride = 20; int drawCount = 0; - StaticQueue queue = chunkArea.sectionQueue; + if(renderTypeEmpty(terrainRenderType)) return 0; + StaticQueue queue = this.sectionQueues.get(terrainRenderType); MemoryStack stack = MemoryStack.stackPush(); ByteBuffer byteBuffer = stack.calloc(20 * queue.size()); - ByteBuffer uboBuffer = stack.calloc(16 * queue.size()); long bufferPtr = MemoryUtil.memAddress0(byteBuffer); - long uboPtr = MemoryUtil.memAddress0(uboBuffer); - TerrainRenderType terrainRenderType = TerrainRenderType.get(renderType); - terrainRenderType.setCutoutUniform(); - boolean isTranslucent = terrainRenderType == TerrainRenderType.TRANSLUCENT; - Pipeline pipeline = PipelineManager.getTerrainIndirectShader(renderType); + boolean isTranslucent = terrainRenderType == TerrainRenderType.TRANSLUCENT; VkCommandBuffer commandBuffer = Renderer.getCommandBuffer(); if(isTranslucent) { vkCmdBindIndexBuffer(commandBuffer, this.indexBuffer.getId(), 0, VK_INDEX_TYPE_UINT16); } - var iterator = queue.iterator(isTranslucent); - while (iterator.hasNext()) { - RenderSection section = iterator.next(); - DrawParameters drawParameters = section.getDrawParameters(terrainRenderType); + + for (var iterator = queue.iterator(isTranslucent); iterator.hasNext(); ) { + DrawParameters drawParameters = iterator.next(); + //Debug // BlockPos o = section.origin; @@ -126,12 +172,9 @@ public int buildDrawBatchesIndirect(IndirectBuffer indirectBuffer, ChunkArea chu // MemoryUtil.memPutInt(ptr + 12, drawParameters.vertexBufferSegment.getOffset() / VERTEX_SIZE); MemoryUtil.memPutInt(ptr + 12, drawParameters.vertexOffset); // MemoryUtil.memPutInt(ptr + 12, drawParameters.vertexBufferSegment.getOffset()); - MemoryUtil.memPutInt(ptr + 16, 0); + MemoryUtil.memPutInt(ptr + 16, drawParameters.baseInstance); + - ptr = uboPtr + (drawCount * 16L); - MemoryUtil.memPutFloat(ptr, (float)((double) section.xOffset - camX)); - MemoryUtil.memPutFloat(ptr + 4, (float)((double) section.yOffset - camY)); - MemoryUtil.memPutFloat(ptr + 8, (float)((double) section.zOffset - camZ)); drawCount++; } @@ -146,15 +189,13 @@ public int buildDrawBatchesIndirect(IndirectBuffer indirectBuffer, ChunkArea chu indirectBuffer.recordCopyCmd(byteBuffer); - pipeline.getManualUBO().setSrc(uboPtr, 16 * drawCount); - LongBuffer pVertexBuffer = stack.longs(vertexBuffer.getId()); - LongBuffer pOffset = stack.longs(0); - vkCmdBindVertexBuffers(commandBuffer, 0, pVertexBuffer, pOffset); + nvkCmdBindVertexBuffers(commandBuffer, 0, 1, stack.npointer(vertexBuffer.getId()), stack.npointer(0)); // pipeline.bindDescriptorSets(Drawer.getCommandBuffer(), WorldRenderer.getInstance().getUniformBuffers(), Drawer.getCurrentFrame()); - pipeline.bindDescriptorSets(commandBuffer, Renderer.getCurrentFrame()); - vkCmdDrawIndexedIndirect(commandBuffer, indirectBuffer.getId(), indirectBuffer.getOffset(), drawCount, stride); + updateChunkAreaOrigin(camX, camY, camZ, commandBuffer, layout, stack.mallocFloat(32)); + vkCmdDrawIndexedIndirect(commandBuffer, indirectBuffer.getId(), indirectBuffer.getOffset(), drawCount, 20); + // fakeIndirectCmd(Drawer.getCommandBuffer(), indirectBuffer, drawCount, uboBuffer); @@ -164,109 +205,25 @@ public int buildDrawBatchesIndirect(IndirectBuffer indirectBuffer, ChunkArea chu return drawCount; } - private static void fakeIndirectCmd(VkCommandBuffer commandBuffer, IndirectBuffer indirectBuffer, int drawCount, ByteBuffer offsetBuffer) { - Pipeline pipeline = PipelineManager.getTerrainDirectShader(null); -// Drawer.getInstance().bindPipeline(pipeline); - pipeline.bindDescriptorSets(Renderer.getCommandBuffer(), Renderer.getCurrentFrame()); -// pipeline.bindDescriptorSets(Drawer.getCommandBuffer(), WorldRenderer.getInstance().getUniformBuffers(), Drawer.getCurrentFrame()); - - ByteBuffer buffer = indirectBuffer.getByteBuffer(); - long address = MemoryUtil.memAddress0(buffer); - long offsetAddress = MemoryUtil.memAddress0(offsetBuffer); - int baseOffset = (int) indirectBuffer.getOffset(); - long offset; - int stride = 20; - - int indexCount; - int instanceCount; - int firstIndex; - int vertexOffset; - int firstInstance; - for(int i = 0; i < drawCount; ++i) { - offset = i * stride + baseOffset + address; - - indexCount = MemoryUtil.memGetInt(offset + 0); - instanceCount = MemoryUtil.memGetInt(offset + 4); - firstIndex = MemoryUtil.memGetInt(offset + 8); - vertexOffset = MemoryUtil.memGetInt(offset + 12); - firstInstance = MemoryUtil.memGetInt(offset + 16); - - long uboOffset = i * 16 + offsetAddress; - - nvkCmdPushConstants(commandBuffer, pipeline.getLayout(), VK_SHADER_STAGE_VERTEX_BIT, 0, 12, uboOffset); - - vkCmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance); - } - } - - public void buildDrawBatchesDirect(StaticQueue queue, Pipeline pipeline, RenderType renderType, double camX, double camY, double camZ) { - TerrainRenderType terrainRenderType = TerrainRenderType.get(renderType); - terrainRenderType.setCutoutUniform(); + public void buildDrawBatchesDirect(TerrainRenderType terrainRenderType, double camX, double camY, double camZ, long layout) { + if(this.renderTypeEmpty(terrainRenderType)) return; boolean isTranslucent = terrainRenderType == TerrainRenderType.TRANSLUCENT; VkCommandBuffer commandBuffer = Renderer.getCommandBuffer(); try(MemoryStack stack = MemoryStack.stackPush()) { - long pVertexBuffer = stack.npointer(vertexBuffer.getId()); - long pOffset = stack.npointer(0); - nvkCmdBindVertexBuffers(commandBuffer, 0, 1, (pVertexBuffer), (pOffset)); - - - - if(isTranslucent) { - vkCmdBindIndexBuffer(commandBuffer, this.indexBuffer.getId(), 0, VK_INDEX_TYPE_UINT16); - } - - pipeline.bindDescriptorSets(commandBuffer, Renderer.getCurrentFrame()); - - int drawCount = 0; - ByteBuffer byteBuffer = stack.malloc(24 * queue.size()); - long bufferPtr = MemoryUtil.memAddress0(byteBuffer); - - var iterator = queue.iterator(isTranslucent); - while (iterator.hasNext()) { - RenderSection section = iterator.next(); - DrawParameters drawParameters = section.getDrawParameters(terrainRenderType); - - if(drawParameters.indexCount == 0) { - continue; - } - - long ptr = bufferPtr + (drawCount * 24L); - MemoryUtil.memPutInt(ptr, drawParameters.indexCount); - MemoryUtil.memPutInt(ptr + 4, drawParameters.firstIndex); - MemoryUtil.memPutInt(ptr + 8, drawParameters.vertexOffset); - - MemoryUtil.memPutFloat(ptr + 12, (float)((double) section.xOffset - camX)); - MemoryUtil.memPutFloat(ptr + 16, (float)((double) section.yOffset - camY)); - MemoryUtil.memPutFloat(ptr + 20, (float)((double) section.zOffset - camZ)); - - drawCount++; - - } - - if(drawCount > 0) { - long offset; - int indexCount; - int firstIndex; - int vertexOffset; - for(int i = 0; i < drawCount; ++i) { - - offset = i * 24 + bufferPtr; - - indexCount = MemoryUtil.memGetInt(offset + 0); - firstIndex = MemoryUtil.memGetInt(offset + 4); - vertexOffset = MemoryUtil.memGetInt(offset + 8); + nvkCmdBindVertexBuffers(commandBuffer, 0, 1, stack.npointer(vertexBuffer.getId()), stack.npointer(0)); + updateChunkAreaOrigin(camX, camY, camZ, commandBuffer, layout, stack.mallocFloat(32)); + } -// if(indexCount == 0) { -// continue; -// } - nvkCmdPushConstants(commandBuffer, pipeline.getLayout(), VK_SHADER_STAGE_VERTEX_BIT, 0, 12, offset + 12); + if(isTranslucent) { + vkCmdBindIndexBuffer(commandBuffer, this.indexBuffer.getId(), 0, VK_INDEX_TYPE_UINT16); + } - vkCmdDrawIndexed(commandBuffer, indexCount, 1, firstIndex, vertexOffset, 0); - } - } + for (var iterator = this.sectionQueues.get(terrainRenderType).iterator(isTranslucent); iterator.hasNext(); ) { + final DrawParameters drawParameters = iterator.next(); + vkCmdDrawIndexed(commandBuffer, drawParameters.indexCount, 1, drawParameters.firstIndex, drawParameters.vertexOffset, drawParameters.baseInstance); } } @@ -276,7 +233,7 @@ public void releaseBuffers() { return; this.vertexBuffer.freeBuffer(); - this.indexBuffer.freeBuffer(); + if(this.indexBuffer!=null) this.indexBuffer.freeBuffer(); this.vertexBuffer = null; this.indexBuffer = null; @@ -287,18 +244,30 @@ public boolean isAllocated() { return allocated; } + public void addDrawCommands(TerrainRenderType r, DrawParameters drawParameters) { + this.sectionQueues.get(r).add(drawParameters); + } + + public void clear() { + this.sectionQueues.values().forEach(StaticQueue::clear); + } + + public void addRenderTypes(Set renderTypes) { + renderTypes.forEach(renderType -> this.sectionQueues.computeIfAbsent(renderType, r->new StaticQueue<>(512))); + } + +// public void clear(TerrainRenderType r) { +// this.sectionQueues.get(r).clear(); +// } + public static class DrawParameters { - int indexCount; - int firstIndex; - int vertexOffset; - AreaBuffer.Segment vertexBufferSegment = new AreaBuffer.Segment(); - AreaBuffer.Segment indexBufferSegment; + int indexCount, firstIndex, vertexOffset, baseInstance; + final AreaBuffer.Segment vertexBufferSegment = new AreaBuffer.Segment(); + final AreaBuffer.Segment indexBufferSegment; boolean ready = false; DrawParameters(boolean translucent) { - if(translucent) { - indexBufferSegment = new AreaBuffer.Segment(); - } + indexBufferSegment = translucent ? new AreaBuffer.Segment() : null; } public void reset(ChunkArea chunkArea) { @@ -307,9 +276,9 @@ public void reset(ChunkArea chunkArea) { this.vertexOffset = 0; int segmentOffset = this.vertexBufferSegment.getOffset(); - if(chunkArea != null && chunkArea.drawBuffers.isAllocated() && segmentOffset != -1) { + if(chunkArea != null && chunkArea.drawBuffers().isAllocated() && segmentOffset != -1) { // this.chunkArea.drawBuffers.vertexBuffer.setSegmentFree(segmentOffset); - chunkArea.drawBuffers.vertexBuffer.setSegmentFree(this.vertexBufferSegment); + chunkArea.drawBuffers().vertexBuffer.setSegmentFree(this.vertexBufferSegment); } } } diff --git a/src/main/java/net/vulkanmod/render/chunk/RenderSection.java b/src/main/java/net/vulkanmod/render/chunk/RenderSection.java index 3ff00396c..fa083bd68 100644 --- a/src/main/java/net/vulkanmod/render/chunk/RenderSection.java +++ b/src/main/java/net/vulkanmod/render/chunk/RenderSection.java @@ -105,19 +105,15 @@ public boolean hasMainDirection() { return this.sourceDirs != 0; } - public boolean resortTransparency(TerrainRenderType renderType, TaskDispatcher taskDispatcher) { - CompiledSection compiledSection1 = this.getCompiledSection(); + public void resortTransparency(TaskDispatcher taskDispatcher) { if (this.compileStatus.sortTask != null) { this.compileStatus.sortTask.cancel(); } - if (!compiledSection1.renderTypes.contains(renderType)) { - return false; - } else { + if (this.getCompiledSection().renderTypes.contains(TerrainRenderType.TRANSLUCENT)) { this.compileStatus.sortTask = new ChunkTask.SortTransparencyTask(this); taskDispatcher.schedule(this.compileStatus.sortTask); - return true; } } diff --git a/src/main/java/net/vulkanmod/render/chunk/WorldRenderer.java b/src/main/java/net/vulkanmod/render/chunk/WorldRenderer.java index 6942c941c..7bd5f2a5a 100644 --- a/src/main/java/net/vulkanmod/render/chunk/WorldRenderer.java +++ b/src/main/java/net/vulkanmod/render/chunk/WorldRenderer.java @@ -31,7 +31,7 @@ import net.vulkanmod.render.PipelineManager; import net.vulkanmod.render.chunk.build.ChunkTask; import net.vulkanmod.render.chunk.build.TaskDispatcher; -import net.vulkanmod.render.chunk.util.AreaSetQueue; +import net.vulkanmod.render.chunk.util.DrawBufferSetQueue; import net.vulkanmod.render.chunk.util.ResettableQueue; import net.vulkanmod.render.chunk.util.Util; import net.vulkanmod.render.profiling.BuildTimeBench; @@ -46,10 +46,13 @@ import net.vulkanmod.vulkan.shader.GraphicsPipeline; import org.joml.FrustumIntersection; import org.joml.Matrix4f; +import org.lwjgl.vulkan.VkCommandBuffer; import javax.annotation.Nullable; import java.util.*; +import static net.vulkanmod.render.vertex.TerrainRenderType.*; + public class WorldRenderer { private static WorldRenderer INSTANCE; @@ -76,7 +79,7 @@ public class WorldRenderer { private final TaskDispatcher taskDispatcher; private final ResettableQueue chunkQueue = new ResettableQueue<>(); - private AreaSetQueue chunkAreaQueue; + private DrawBufferSetQueue drawBufferSetQueue; private short lastFrame = 0; private double xTransparentOld; @@ -300,7 +303,7 @@ private void initUpdate() { } private void resetUpdateQueues() { - this.chunkAreaQueue.clear(); + this.drawBufferSetQueue.clear(); this.sectionGrid.chunkAreaManager.resetQueues(); } @@ -315,10 +318,13 @@ private void updateRenderChunks() { while(this.chunkQueue.hasNext()) { RenderSection renderSection = this.chunkQueue.poll(); - if(!renderSection.isCompletelyEmpty()) { - renderSection.getChunkArea().sectionQueue.add(renderSection); - this.chunkAreaQueue.add(renderSection.getChunkArea()); + final DrawBuffers drawBuffers = renderSection.getChunkArea().getDrawBuffers(); + //Empty drawCmds never seem to occur anymore, which should be completely impossible but it somehow works + for(var t : renderSection.getCompiledSection().renderTypes) { + drawBuffers.addDrawCommands(t, renderSection.getDrawParameters(t)); + } + this.drawBufferSetQueue.add(drawBuffers); this.nonEmptyChunks++; } @@ -358,8 +364,12 @@ private void updateRenderChunksSpectator() { if(!renderSection.isCompletelyEmpty()) { - renderSection.getChunkArea().sectionQueue.add(renderSection); - this.chunkAreaQueue.add(renderSection.getChunkArea()); + final DrawBuffers drawBuffers = renderSection.getChunkArea().getDrawBuffers(); + //Empty drawCmds never seem to occur anymore, which should be completely impossible but it somehow works + for(var t : renderSection.getCompiledSection().renderTypes) { + drawBuffers.addDrawCommands(t, renderSection.getDrawParameters(t)); + } + this.drawBufferSetQueue.add(drawBuffers); this.nonEmptyChunks++; } @@ -489,7 +499,7 @@ public void allChanged() { } this.sectionGrid = new SectionGrid(this.level, this.minecraft.options.getEffectiveRenderDistance()); - this.chunkAreaQueue = new AreaSetQueue(this.sectionGrid.chunkAreaManager.size); + this.drawBufferSetQueue = new DrawBufferSetQueue(this.sectionGrid.chunkAreaManager.size); this.onAllChangedCallbacks.forEach(Runnable::run); @@ -537,12 +547,12 @@ public void renderSectionLayer(RenderType renderType, PoseStack poseStack, doubl //debug // Profiler p = Profiler.getProfiler("chunks"); Profiler2 p = Profiler2.getMainProfiler(); - final String layerName = getLayerName(renderType); + final TerrainRenderType terrainRenderType = get(renderType.name); // p.pushMilestone("layer " + layerName); - if(layerName.equals("solid")) + if(terrainRenderType.equals(SOLID)) p.push("Opaque_terrain_pass"); - else if(layerName.equals("translucent")) + else if(terrainRenderType.equals(TRANSLUCENT)) { p.pop(); p.push("Translucent_terrain_pass"); @@ -558,84 +568,64 @@ else if(layerName.equals("translucent")) this.minecraft.getProfiler().popPush(() -> { return "render_" + renderType; }); - boolean flag = renderType == RenderType.translucent(); + boolean isTranslucent = terrainRenderType == TRANSLUCENT; boolean indirectDraw = Initializer.CONFIG.indirectDraw; VRenderSystem.applyMVP(poseStack.last().pose(), projection); - Renderer renderer = Renderer.getInstance(); - GraphicsPipeline pipeline = PipelineManager.getTerrainShader(renderType); - renderer.bindGraphicsPipeline(pipeline); - Renderer.getDrawer().bindAutoIndexBuffer(Renderer.getCommandBuffer(), 7); + final VkCommandBuffer commandBuffer = Renderer.getCommandBuffer(); + p.push("draw batches"); - int currentFrame = Renderer.getCurrentFrame(); - if((Initializer.CONFIG.uniqueOpaqueLayer ? TerrainRenderType.COMPACT_RENDER_TYPES : TerrainRenderType.SEMI_COMPACT_RENDER_TYPES).contains(renderType)) { - Iterator iterator = this.chunkAreaQueue.iterator(flag); - while(iterator.hasNext()) { - ChunkArea chunkArea = iterator.next(); + final int currentFrame = Renderer.getCurrentFrame(); + if((Initializer.CONFIG.uniqueOpaqueLayer ? COMPACT_RENDER_TYPES : SEMI_COMPACT_RENDER_TYPES).contains(terrainRenderType)) { + + + GraphicsPipeline terrainShader = PipelineManager.getTerrainShader(terrainRenderType); + Renderer.getInstance().bindGraphicsPipeline(terrainShader); + Renderer.getDrawer().bindAutoIndexBuffer(commandBuffer, 7); + terrainShader.bindDescriptorSets(commandBuffer, currentFrame); + + final long layout = terrainShader.getLayout(); + + for(Iterator iterator = this.drawBufferSetQueue.iterator(isTranslucent);iterator.hasNext();) { + DrawBuffers drawBuffers = iterator.next(); if(indirectDraw) { - chunkArea.getDrawBuffers().buildDrawBatchesIndirect(indirectBuffers[currentFrame], chunkArea, renderType, camX, camY, camZ); + drawBuffers.buildDrawBatchesIndirect(indirectBuffers[currentFrame], terrainRenderType, camX, camY, camZ, layout); } else { - chunkArea.getDrawBuffers().buildDrawBatchesDirect(chunkArea.sectionQueue, pipeline, renderType, camX, camY, camZ); + drawBuffers.buildDrawBatchesDirect(terrainRenderType, camX, camY, camZ, layout); } } } - if(layerName.equals("cutout") || layerName.equals("tripwire")) { + if(indirectDraw && (terrainRenderType.equals(CUTOUT) || terrainRenderType.equals(TRIPWIRE))) { indirectBuffers[currentFrame].submitUploads(); // uniformBuffers.submitUploads(); } p.pop(); - //Need to reset push constant in case the pipeline will still be used for rendering - if(!indirectDraw) { - VRenderSystem.setChunkOffset(0, 0, 0); - renderer.pushConstants(pipeline); - } + this.minecraft.getProfiler().pop(); renderType.clearRenderState(); VRenderSystem.applyMVP(RenderSystem.getModelViewMatrix(), RenderSystem.getProjectionMatrix()); - switch (layerName) { - case "cutout" -> { + switch (terrainRenderType) { + case CUTOUT -> { p.pop(); // p.pop(); // p.push("Render_level_2"); p.push("entities"); } // case "translucent" -> p.pop(); - case "tripwire" -> p.pop(); + case TRIPWIRE -> p.pop(); } } - private static String getLayerName(RenderType renderType) { - RenderType solid = RenderType.solid(); - RenderType cutout = RenderType.cutout(); - RenderType cutoutMipped = RenderType.cutoutMipped(); - RenderType translucent = RenderType.translucent(); - RenderType tripwire = RenderType.tripwire(); - - String layerName; - if (solid.equals(renderType)) { - layerName = "solid"; - } else if (cutout.equals(renderType)) { - layerName = "cutout"; - } else if (cutoutMipped.equals(renderType)) { - layerName = "cutoutMipped"; - } else if (tripwire.equals(renderType)) { - layerName = "tripwire"; - } else if (translucent.equals(renderType)) { - layerName = "translucent"; - } else layerName = "unk"; - return layerName; - } - private void sortTranslucentSections(double camX, double camY, double camZ) { this.minecraft.getProfiler().push("translucent_sort"); double d0 = camX - this.xTransparentOld; @@ -659,7 +649,7 @@ private void sortTranslucentSections(double camX, double camY, double camZ) { while(iterator.hasNext() && j < 15) { RenderSection section = iterator.next(); - section.resortTransparency(TerrainRenderType.TRANSLUCENT, this.taskDispatcher); + section.resortTransparency(this.taskDispatcher); ++j; } diff --git a/src/main/java/net/vulkanmod/render/chunk/build/ChunkTask.java b/src/main/java/net/vulkanmod/render/chunk/build/ChunkTask.java index bead0cd6a..7f84699af 100644 --- a/src/main/java/net/vulkanmod/render/chunk/build/ChunkTask.java +++ b/src/main/java/net/vulkanmod/render/chunk/build/ChunkTask.java @@ -28,14 +28,13 @@ import net.vulkanmod.render.vertex.TerrainRenderType; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.EnumMap; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import static net.vulkanmod.render.vertex.TerrainRenderType.*; + public abstract class ChunkTask { private static TaskDispatcher taskDispatcher; @@ -68,6 +67,8 @@ public static void setTaskDispatcher(TaskDispatcher dispatcher) { } public static class BuildTask extends ChunkTask { + private final BlockPos startBlockPos; + private final Iterable blockPos; @Nullable protected RenderChunkRegion region; @@ -79,6 +80,9 @@ public BuildTask(RenderSection renderSection, RenderChunkRegion renderChunkRegio super(renderSection); this.region = renderChunkRegion; this.highPriority = highPriority; + startBlockPos = new BlockPos(this.renderSection.xOffset(), this.renderSection.yOffset(), this.renderSection.zOffset()).immutable(); + BlockPos endBlockPos = startBlockPos.offset(15, 15, 15); + blockPos = BlockPos.betweenClosed(startBlockPos, endBlockPos); } public String name() { @@ -142,20 +146,17 @@ public CompletableFuture doTask(ThreadBuilderPack chunkBufferBuilderPack private CompileResults compile(float camX, float camY, float camZ, ThreadBuilderPack chunkBufferBuilderPack) { CompileResults compileResults = new CompileResults(); - BlockPos startBlockPos = new BlockPos(renderSection.xOffset(), renderSection.yOffset(), renderSection.zOffset()).immutable(); - - BlockPos endBlockPos = startBlockPos.offset(15, 15, 15); VisGraph visGraph = new VisGraph(); RenderChunkRegion renderChunkRegion = this.region; this.region = null; PoseStack poseStack = new PoseStack(); if (renderChunkRegion != null) { ModelBlockRenderer.enableCaching(); - Set set = new ReferenceArraySet<>(RenderType.chunkBufferLayers().size()); + final EnumSet set = EnumSet.noneOf(TerrainRenderType.class); RandomSource randomSource = RandomSource.create(); BlockRenderDispatcher blockRenderDispatcher = Minecraft.getInstance().getBlockRenderer(); - for(BlockPos blockPos : BlockPos.betweenClosed(startBlockPos, endBlockPos)) { + for(BlockPos blockPos : blockPos) { BlockState blockState = renderChunkRegion.getBlockState(blockPos); if (blockState.isSolidRender(renderChunkRegion, blockPos)) { visGraph.setOpaque(blockPos); @@ -170,13 +171,13 @@ private CompileResults compile(float camX, float camY, float camZ, ThreadBuilder // BlockState blockState2 = renderChunkRegion.getBlockState(blockPos); FluidState fluidState = blockState.getFluidState(); - RenderType renderType; + TerrainRenderType renderType; TerrainBufferBuilder bufferBuilder; if (!fluidState.isEmpty()) { - renderType = ItemBlockRenderTypes.getRenderLayer(fluidState); //Force compact RenderType - renderType = compactRenderTypes(renderType); + renderType = TerrainRenderType.getCompact(ItemBlockRenderTypes.getRenderLayer(fluidState).name); + bufferBuilder = chunkBufferBuilderPack.builder(renderType); if (set.add(renderType)) { @@ -189,10 +190,10 @@ private CompileResults compile(float camX, float camY, float camZ, ThreadBuilder } if (blockState.getRenderShape() != RenderShape.INVISIBLE) { - renderType = ItemBlockRenderTypes.getChunkRenderType(blockState); //Force compact RenderType - renderType = compactRenderTypes(renderType); + renderType = TerrainRenderType.getCompact(ItemBlockRenderTypes.getChunkRenderType(blockState).name); + bufferBuilder = chunkBufferBuilderPack.builder(renderType); if (set.add(renderType)) { @@ -208,19 +209,18 @@ private CompileResults compile(float camX, float camY, float camZ, ThreadBuilder } } - if (set.contains(RenderType.translucent())) { - TerrainBufferBuilder bufferBuilder2 = chunkBufferBuilderPack.builder(RenderType.translucent()); + if (set.contains(TRANSLUCENT)) { + TerrainBufferBuilder bufferBuilder2 = chunkBufferBuilderPack.builder(TRANSLUCENT); if (!bufferBuilder2.isCurrentBatchEmpty()) { - bufferBuilder2.setQuadSortOrigin(camX - (float)startBlockPos.getX(), camY - (float)startBlockPos.getY(), camZ - (float)startBlockPos.getZ()); + bufferBuilder2.setQuadSortOrigin(camX - (float) startBlockPos.getX(), camY - (float) startBlockPos.getY(), camZ - (float) startBlockPos.getZ()); compileResults.transparencyState = bufferBuilder2.getSortState(); } } - for(RenderType renderType2 : set) { + for(TerrainRenderType renderType2 : set) { TerrainBufferBuilder.RenderedBuffer renderedBuffer = chunkBufferBuilderPack.builder(renderType2).endOrDiscardIfEmpty(); if (renderedBuffer != null) { - UploadBuffer uploadBuffer = new UploadBuffer(renderedBuffer); - compileResults.renderedLayers.put(TerrainRenderType.get(renderType2), uploadBuffer); + compileResults.renderedLayers.put(renderType2, new UploadBuffer(renderedBuffer)); } if(renderedBuffer != null) @@ -234,16 +234,16 @@ private CompileResults compile(float camX, float camY, float camZ, ThreadBuilder return compileResults; } - private RenderType compactRenderTypes(RenderType renderType) { + private TerrainRenderType compactRenderTypes(TerrainRenderType renderType) { if(Initializer.CONFIG.uniqueOpaqueLayer) { - if (renderType != RenderType.translucent()) { - renderType = renderType == RenderType.tripwire() ? RenderType.translucent() : RenderType.cutoutMipped(); + if (renderType != TRANSLUCENT) { + renderType = renderType == TRIPWIRE ? TRANSLUCENT : CUTOUT_MIPPED; } } else { - if (renderType != RenderType.translucent() && renderType != RenderType.cutout()) { - renderType = renderType == RenderType.tripwire() ? RenderType.translucent() : RenderType.cutoutMipped(); + if (renderType != TRANSLUCENT && renderType != CUTOUT) { + renderType = renderType == TRIPWIRE ? TRANSLUCENT : CUTOUT_MIPPED; } } @@ -298,8 +298,8 @@ public CompletableFuture doTask(ThreadBuilderPack builderPack) { float f1 = (float)vec3.y; float f2 = (float)vec3.z; TerrainBufferBuilder.SortState transparencyState = this.compiledSection.transparencyState; - if (transparencyState != null && this.compiledSection.renderTypes.contains(TerrainRenderType.TRANSLUCENT)) { - TerrainBufferBuilder bufferbuilder = builderPack.builder(RenderType.translucent()); + if (transparencyState != null && this.compiledSection.renderTypes.contains(TRANSLUCENT)) { + TerrainBufferBuilder bufferbuilder = builderPack.builder(TRANSLUCENT); bufferbuilder.begin(VertexFormat.Mode.QUADS, PipelineManager.TERRAIN_VERTEX_FORMAT); bufferbuilder.restoreSortState(transparencyState); // bufferbuilder.setQuadSortOrigin(f - (float) this.renderSection.origin.getX(), f1 - (float) renderSection.origin.getY(), f2 - (float) renderSection.origin.getZ()); @@ -310,8 +310,7 @@ public CompletableFuture doTask(ThreadBuilderPack builderPack) { return CompletableFuture.completedFuture(Result.CANCELLED); } else { - UploadBuffer uploadBuffer = new UploadBuffer(renderedBuffer); - taskDispatcher.scheduleUploadChunkLayer(renderSection, TerrainRenderType.get(RenderType.translucent()), uploadBuffer); + taskDispatcher.scheduleUploadChunkLayer(renderSection, TRANSLUCENT, new UploadBuffer(renderedBuffer)); renderedBuffer.release(); return CompletableFuture.completedFuture(Result.SUCCESSFUL); diff --git a/src/main/java/net/vulkanmod/render/chunk/build/TaskDispatcher.java b/src/main/java/net/vulkanmod/render/chunk/build/TaskDispatcher.java index 5beb3f145..bb858714e 100644 --- a/src/main/java/net/vulkanmod/render/chunk/build/TaskDispatcher.java +++ b/src/main/java/net/vulkanmod/render/chunk/build/TaskDispatcher.java @@ -146,11 +146,11 @@ private void doSectionUpdate(RenderSection section, EnumMap terrainBuilderConstructor; + private static final Function terrainBuilderConstructor = renderType -> new TerrainBufferBuilder(renderType.bufferSize); - public static void defaultTerrainBuilderConstructor() { - terrainBuilderConstructor = renderType -> new TerrainBufferBuilder(renderType.bufferSize()); - } - - public static void setTerrainBuilderConstructor(Function constructor) { - terrainBuilderConstructor = constructor; - } - private final Map builders; + private final EnumMap builders=new EnumMap<>(TerrainRenderType.class); public ThreadBuilderPack() { - builders = RenderType.chunkBufferLayers().stream().collect(Collectors.toMap( - (renderType) -> renderType, - renderType -> terrainBuilderConstructor.apply(renderType))); + for (TerrainRenderType renderType : TerrainRenderType.getActiveLayers()) { + builders.put(renderType, terrainBuilderConstructor.apply(renderType)); + } } - public TerrainBufferBuilder builder(RenderType renderType) { + public TerrainBufferBuilder builder(TerrainRenderType renderType) { return this.builders.get(renderType); } diff --git a/src/main/java/net/vulkanmod/render/chunk/util/AreaSetQueue.java b/src/main/java/net/vulkanmod/render/chunk/util/DrawBufferSetQueue.java similarity index 52% rename from src/main/java/net/vulkanmod/render/chunk/util/AreaSetQueue.java rename to src/main/java/net/vulkanmod/render/chunk/util/DrawBufferSetQueue.java index 7c26cf608..ec43b5524 100644 --- a/src/main/java/net/vulkanmod/render/chunk/util/AreaSetQueue.java +++ b/src/main/java/net/vulkanmod/render/chunk/util/DrawBufferSetQueue.java @@ -1,25 +1,18 @@ package net.vulkanmod.render.chunk.util; -import net.vulkanmod.render.chunk.ChunkArea; +import net.vulkanmod.render.chunk.DrawBuffers; import java.util.Arrays; import java.util.Iterator; -import java.util.LinkedHashSet; -public class AreaSetQueue { - private final int size; - int[] set; - ResettableQueue queue; +public record DrawBufferSetQueue(int size, int[] set, StaticQueue queue) +{ - public AreaSetQueue(int size) { - this.size = size; - - int t = (int) Math.ceil((float)size / Integer.SIZE); - this.set = new int[t]; - this.queue = new ResettableQueue<>(size); + public DrawBufferSetQueue(int size) { + this(size, new int[(int) Math.ceil((float)size / Integer.SIZE)], new StaticQueue<>(size)); } - public void add(ChunkArea chunkArea) { + public void add(DrawBuffers chunkArea) { if(chunkArea.index >= this.size) throw new IndexOutOfBoundsException(); @@ -36,11 +29,11 @@ public void clear() { this.queue.clear(); } - public Iterator iterator(boolean reverseOrder) { + public Iterator iterator(boolean reverseOrder) { return queue.iterator(reverseOrder); } - public Iterator iterator() { + public Iterator iterator() { return this.iterator(false); } diff --git a/src/main/java/net/vulkanmod/render/vertex/TerrainRenderType.java b/src/main/java/net/vulkanmod/render/vertex/TerrainRenderType.java index db9fb8c66..43b6e4560 100644 --- a/src/main/java/net/vulkanmod/render/vertex/TerrainRenderType.java +++ b/src/main/java/net/vulkanmod/render/vertex/TerrainRenderType.java @@ -1,51 +1,62 @@ package net.vulkanmod.render.vertex; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.client.renderer.RenderType; +import net.vulkanmod.Initializer; import net.vulkanmod.vulkan.VRenderSystem; -import java.util.Arrays; -import java.util.Hashtable; -import java.util.Map; -import java.util.stream.Collectors; +import java.util.EnumSet; public enum TerrainRenderType { - SOLID(RenderType.solid(), 0.0f), - CUTOUT_MIPPED(RenderType.cutoutMipped(), 0.5f), - CUTOUT(RenderType.cutout(), 0.1f), - TRANSLUCENT(RenderType.translucent(), 0.0f), - TRIPWIRE(RenderType.tripwire(), 0.1f); + SOLID(RenderType.solid()), + CUTOUT_MIPPED(RenderType.cutoutMipped()), + CUTOUT(RenderType.cutout()), + TRANSLUCENT(RenderType.translucent()), + TRIPWIRE(RenderType.tripwire()); public static final TerrainRenderType[] VALUES = TerrainRenderType.values(); - private static final Map RENDER_TYPE_MAP = new Hashtable<>( - Arrays.stream(TerrainRenderType.values()).collect(Collectors.toMap( - (terrainRenderType) -> terrainRenderType.renderType, (terrainRenderType) -> terrainRenderType))); + public static final EnumSet COMPACT_RENDER_TYPES = EnumSet.of(CUTOUT_MIPPED, TRANSLUCENT); + public static final EnumSet SEMI_COMPACT_RENDER_TYPES = EnumSet.of(CUTOUT_MIPPED, CUTOUT, TRANSLUCENT); - public static final ObjectArrayList COMPACT_RENDER_TYPES = new ObjectArrayList<>(); - public static final ObjectArrayList SEMI_COMPACT_RENDER_TYPES = new ObjectArrayList<>(); - - static { - SEMI_COMPACT_RENDER_TYPES.add(RenderType.cutout()); - COMPACT_RENDER_TYPES.add(RenderType.cutoutMipped()); - SEMI_COMPACT_RENDER_TYPES.add(RenderType.cutoutMipped()); - COMPACT_RENDER_TYPES.add(RenderType.translucent()); - SEMI_COMPACT_RENDER_TYPES.add(RenderType.translucent()); + public final int bufferSize; + TerrainRenderType(RenderType renderType) { + this.bufferSize = renderType.bufferSize(); + } + public static EnumSet getActiveLayers() { + return Initializer.CONFIG.uniqueOpaqueLayer ? COMPACT_RENDER_TYPES : SEMI_COMPACT_RENDER_TYPES; } - final RenderType renderType; - final float alphaCutout; + public static TerrainRenderType getCompact(String renderType) { + if(Initializer.CONFIG.uniqueOpaqueLayer) { + return switch (renderType) + { + case "solid", "cutout", "cutout_mipped" -> CUTOUT_MIPPED; + default -> TRANSLUCENT; + }; + + } + else { + return switch (renderType) + { + case "solid", "cutout_mipped" -> CUTOUT_MIPPED; + case "cutout" -> CUTOUT; + default -> TRANSLUCENT; + }; + } - TerrainRenderType(RenderType renderType, float alphaCutout) { - this.renderType = renderType; - this.alphaCutout = alphaCutout; - } - public void setCutoutUniform() { - VRenderSystem.alphaCutout = this.alphaCutout; } - public static TerrainRenderType get(RenderType renderType) { - return RENDER_TYPE_MAP.get(renderType); + + + public static TerrainRenderType get(String renderType) { + return switch (renderType) + { + case "solid" -> SOLID; + case "cutout_mipped" -> CUTOUT_MIPPED; + case "cutout" -> CUTOUT; + case "tripwire" -> TRIPWIRE; + default -> TRANSLUCENT; + }; } } diff --git a/src/main/java/net/vulkanmod/vulkan/VRenderSystem.java b/src/main/java/net/vulkanmod/vulkan/VRenderSystem.java index 037b16918..f06a87d11 100644 --- a/src/main/java/net/vulkanmod/vulkan/VRenderSystem.java +++ b/src/main/java/net/vulkanmod/vulkan/VRenderSystem.java @@ -3,12 +3,7 @@ import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.mojang.blaze3d.vertex.Tesselator; -import com.mojang.blaze3d.vertex.VertexFormat; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GameRenderer; import net.vulkanmod.vulkan.shader.PipelineState; import net.vulkanmod.vulkan.util.ColorUtil; import net.vulkanmod.vulkan.util.MappedBuffer; @@ -31,21 +26,21 @@ public abstract class VRenderSystem { public static boolean cull = true; public static final float clearDepth = 1.0f; - public static FloatBuffer clearColor = MemoryUtil.memAllocFloat(4); + public static FloatBuffer clearColor = MemoryUtil.memCallocFloat(4); //Avoid the driver caching dirty memory as a clear Color - public static MappedBuffer modelViewMatrix = new MappedBuffer(16 * 4); - public static MappedBuffer projectionMatrix = new MappedBuffer(16 * 4); - public static MappedBuffer TextureMatrix = new MappedBuffer(16 * 4); - public static MappedBuffer MVP = new MappedBuffer(16 * 4); + public static final MappedBuffer modelViewMatrix = new MappedBuffer(MemoryUtil.memAlloc(16 * 4)); + public static final MappedBuffer projectionMatrix = new MappedBuffer(MemoryUtil.memAlloc(16 * 4)); + public static final MappedBuffer TextureMatrix = new MappedBuffer(MemoryUtil.memAlloc(16 * 4)); + public static final MappedBuffer MVP = new MappedBuffer(MemoryUtil.memAlloc(16 * 4)); - public static MappedBuffer ChunkOffset = new MappedBuffer(3 * 4); - public static MappedBuffer lightDirection0 = new MappedBuffer(3 * 4); - public static MappedBuffer lightDirection1 = new MappedBuffer(3 * 4); + public static final MappedBuffer ChunkOffset = new MappedBuffer(MemoryUtil.memAlloc(3 * 4)); + public static final MappedBuffer lightDirection0 = new MappedBuffer(MemoryUtil.memAlloc(3 * 4)); + public static final MappedBuffer lightDirection1 = new MappedBuffer(MemoryUtil.memAlloc(3 * 4)); - public static MappedBuffer shaderColor = new MappedBuffer(4 * 4); - public static MappedBuffer shaderFogColor = new MappedBuffer(4 * 4); + public static final MappedBuffer shaderColor = new MappedBuffer(MemoryUtil.memAlloc(4 * 4)); + public static final MappedBuffer shaderFogColor = new MappedBuffer(MemoryUtil.memAlloc(4 * 4)); - public static MappedBuffer screenSize = new MappedBuffer(2 * 4); + public static final MappedBuffer screenSize = new MappedBuffer(MemoryUtil.memAlloc(2 * 4)); public static float alphaCutout = 0.0f; @@ -58,7 +53,7 @@ public static void initRenderer() Vulkan.initVulkan(window); } - public static ByteBuffer getChunkOffset() { return ChunkOffset.buffer; } + public static ByteBuffer getChunkOffset() { return ChunkOffset.buffer(); } public static int maxSupportedTextureSize() { return DeviceManager.deviceProperties.limits().maxImageDimension2D(); @@ -71,23 +66,22 @@ public static void applyMVP(Matrix4f MV, Matrix4f P) { } public static void applyModelViewMatrix(Matrix4f mat) { - mat.get(modelViewMatrix.buffer.asFloatBuffer()); + mat.get(modelViewMatrix.buffer().asFloatBuffer()); //MemoryUtil.memPutFloat(MemoryUtil.memAddress(modelViewMatrix), 1); } public static void applyProjectionMatrix(Matrix4f mat) { - mat.get(projectionMatrix.buffer.asFloatBuffer()); + mat.get(projectionMatrix.buffer().asFloatBuffer()); } public static void calculateMVP() { - org.joml.Matrix4f MV = new org.joml.Matrix4f(modelViewMatrix.buffer.asFloatBuffer()); - org.joml.Matrix4f P = new org.joml.Matrix4f(projectionMatrix.buffer.asFloatBuffer()); - - P.mul(MV).get(MVP.buffer); + org.joml.Matrix4f MV = new org.joml.Matrix4f(modelViewMatrix.buffer().asFloatBuffer()); + org.joml.Matrix4f P = new org.joml.Matrix4f(projectionMatrix.buffer().asFloatBuffer()); + P.mul(MV).get(MVP.buffer()); } public static void setTextureMatrix(Matrix4f mat) { - mat.get(TextureMatrix.buffer.asFloatBuffer()); + mat.get(TextureMatrix.buffer().asFloatBuffer()); } public static MappedBuffer getTextureMatrix() { @@ -107,7 +101,7 @@ public static MappedBuffer getMVP() { } public static void setChunkOffset(float f1, float f2, float f3) { - long ptr = ChunkOffset.ptr; + long ptr = ChunkOffset.ptr(); VUtil.UNSAFE.putFloat(ptr, f1); VUtil.UNSAFE.putFloat(ptr + 4, f2); VUtil.UNSAFE.putFloat(ptr + 8, f3); diff --git a/src/main/java/net/vulkanmod/vulkan/shader/Pipeline.java b/src/main/java/net/vulkanmod/vulkan/shader/Pipeline.java index 7bca8b45e..d464624a2 100644 --- a/src/main/java/net/vulkanmod/vulkan/shader/Pipeline.java +++ b/src/main/java/net/vulkanmod/vulkan/shader/Pipeline.java @@ -484,6 +484,11 @@ public void setUniforms(List UBOs, List imageDescriptors) this.imageDescriptors = imageDescriptors; } + public void compileShaders2(SPIRV vertShaderSPIRV1, SPIRV fragShaderSPIRV1) { + this.vertShaderSPIRV = vertShaderSPIRV1; + this.fragShaderSPIRV = fragShaderSPIRV1; + } + public void compileShaders() { String resourcePath = SPIRVUtils.class.getResource("/assets/vulkanmod/shaders/").toExternalForm(); diff --git a/src/main/java/net/vulkanmod/vulkan/shader/layout/Uniform.java b/src/main/java/net/vulkanmod/vulkan/shader/layout/Uniform.java index dec970668..0fa43ab33 100644 --- a/src/main/java/net/vulkanmod/vulkan/shader/layout/Uniform.java +++ b/src/main/java/net/vulkanmod/vulkan/shader/layout/Uniform.java @@ -42,7 +42,7 @@ public String getName() { void update(long ptr) { MappedBuffer src = values.get(); - MemoryUtil.memCopy(src.ptr, ptr + this.offset, this.size); + MemoryUtil.memCopy(src.ptr(), ptr + this.offset, this.size); } public static Uniform createField(Info info) { diff --git a/src/main/java/net/vulkanmod/vulkan/texture/VulkanImage.java b/src/main/java/net/vulkanmod/vulkan/texture/VulkanImage.java index 8c617327b..94ee92bc9 100644 --- a/src/main/java/net/vulkanmod/vulkan/texture/VulkanImage.java +++ b/src/main/java/net/vulkanmod/vulkan/texture/VulkanImage.java @@ -141,7 +141,7 @@ public static int getAspect(int format) { public static boolean isDepthFormat(int format) { return switch (format) { - case VK_FORMAT_D32_SFLOAT, VK_FORMAT_D24_UNORM_S8_UINT, + case VK_FORMAT_D32_SFLOAT, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_X8_D24_UNORM_PACK32, VK_FORMAT_D32_SFLOAT_S8_UINT -> true; default -> false; }; diff --git a/src/main/java/net/vulkanmod/vulkan/util/MappedBuffer.java b/src/main/java/net/vulkanmod/vulkan/util/MappedBuffer.java index 67b0f246f..d2e57312d 100644 --- a/src/main/java/net/vulkanmod/vulkan/util/MappedBuffer.java +++ b/src/main/java/net/vulkanmod/vulkan/util/MappedBuffer.java @@ -4,22 +4,18 @@ import java.nio.ByteBuffer; -public class MappedBuffer { +public record MappedBuffer( ByteBuffer buffer, long ptr) { - public final ByteBuffer buffer; - public final long ptr; public static MappedBuffer createFromBuffer(ByteBuffer buffer) { - return new MappedBuffer(buffer, MemoryUtil.memAddress0(buffer)); + return new MappedBuffer(buffer); } - MappedBuffer(ByteBuffer buffer, long ptr) { - this.buffer = buffer; - this.ptr = ptr; + public static MappedBuffer getMappedBuffer(ByteBuffer buffer, long ptr) { + return new MappedBuffer(buffer, ptr); } - public MappedBuffer(int size) { - this.buffer = MemoryUtil.memAlloc(size); - this.ptr = MemoryUtil.memAddress0(this.buffer); + public MappedBuffer(ByteBuffer buffer) { + this(buffer, MemoryUtil.memAddress0(buffer)); } public void putFloat(int idx, float f) { diff --git a/src/main/resources/assets/vulkanmod/shaders/basic/terrain_direct/terrain_direct.fsh b/src/main/resources/assets/vulkanmod/shaders/basic/terrain/terrain.fsh similarity index 76% rename from src/main/resources/assets/vulkanmod/shaders/basic/terrain_direct/terrain_direct.fsh rename to src/main/resources/assets/vulkanmod/shaders/basic/terrain/terrain.fsh index 81a508fd6..96d2a7fbc 100644 --- a/src/main/resources/assets/vulkanmod/shaders/basic/terrain_direct/terrain_direct.fsh +++ b/src/main/resources/assets/vulkanmod/shaders/basic/terrain/terrain.fsh @@ -5,11 +5,9 @@ layout(binding = 2) uniform sampler2D Sampler0; layout(binding = 1) uniform UBO{ - vec4 ColorModulator; vec4 FogColor; float FogStart; float FogEnd; - float AlphaCutout; }; layout(location = 0) in float vertexDistance; @@ -20,8 +18,8 @@ layout(location = 2) in vec2 texCoord0; layout(location = 0) out vec4 fragColor; void main() { - vec4 color = texture(Sampler0, texCoord0) * vertexColor * ColorModulator; - if (color.a < AlphaCutout) { + vec4 color = texture(Sampler0, texCoord0) * vertexColor; + if (color.a < 0.5f) { discard; } fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor); diff --git a/src/main/resources/assets/vulkanmod/shaders/basic/terrain_direct/terrain_direct.json b/src/main/resources/assets/vulkanmod/shaders/basic/terrain/terrain.json similarity index 54% rename from src/main/resources/assets/vulkanmod/shaders/basic/terrain_direct/terrain_direct.json rename to src/main/resources/assets/vulkanmod/shaders/basic/terrain/terrain.json index ec928945a..0cc67b967 100644 --- a/src/main/resources/assets/vulkanmod/shaders/basic/terrain_direct/terrain_direct.json +++ b/src/main/resources/assets/vulkanmod/shaders/basic/terrain/terrain.json @@ -18,28 +18,22 @@ { "name": "Sampler2" } ], "uniforms": [ - { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "ChunkOffset", "type": "float", "count": 3, "values": [ 0.0, 0.0, 0.0 ] }, - { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }, { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] }, { "name": "FogColor", "type": "float", "count": 4, "values": [ 0.0, 0.0, 0.0, 0.0 ] } ], "UBOs": [ { "type": "vertex", "binding": 0, "fields": [ - { "name": "MVP", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] } + { "name": "ChunkOffset", "type": "float", "count": 3, "values": [ 0.0, 0.0, 0.0 ] } ] }, { "type": "fragment", "binding": 1, "fields": [ - { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }, { "name": "FogColor", "type": "float", "count": 4, "values": [ 0.0, 0.0, 0.0, 0.0 ] }, { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, - { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] }, - { "name": "AlphaCutout", "type": "float", "count": 1, "values": [ 1.0 ] } + { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] } ] } ], "PushConstants": [ - { "name": "ChunkOffset", "type": "float", "count": 3, "values": [0.0, 0.0, 0.0] } + { "name": "MVP", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] } ] } diff --git a/src/main/resources/assets/vulkanmod/shaders/basic/terrain_direct/terrain_direct.vsh b/src/main/resources/assets/vulkanmod/shaders/basic/terrain/terrain.vsh similarity index 69% rename from src/main/resources/assets/vulkanmod/shaders/basic/terrain_direct/terrain_direct.vsh rename to src/main/resources/assets/vulkanmod/shaders/basic/terrain/terrain.vsh index a08f80d2f..286f2cd06 100644 --- a/src/main/resources/assets/vulkanmod/shaders/basic/terrain_direct/terrain_direct.vsh +++ b/src/main/resources/assets/vulkanmod/shaders/basic/terrain/terrain.vsh @@ -3,12 +3,12 @@ #include "light.glsl" layout(binding = 0) uniform UniformBufferObject { - mat4 MVP; - mat4 ModelViewMat; + vec3 dummy; }; layout(push_constant) uniform pushConstant { - vec3 ChunkOffset; + mat4 MVP; + mat4 ProjMat; }; layout(binding = 3) uniform sampler2D Sampler2; @@ -26,13 +26,15 @@ layout(location = 3) in ivec2 UV2; //layout(location = 4) in vec3 Normal; const float UV_INV = 1.0 / 65536.0; -const float POSITION_INV = 1.0 / 1900.0; +const vec3 POSITION_INV = vec3(1.0 / 1900.0); void main() { - vec3 pos = (Position * POSITION_INV); - gl_Position = MVP * vec4(pos + ChunkOffset, 1.0); + const vec3 baseOffset = bitfieldExtract(ivec3(gl_InstanceIndex)>> ivec3(0, 16, 8), 0, 8); + const vec3 pos = fma(Position, vec3(POSITION_INV), baseOffset); + const vec4 xyz = vec4(pos, 1); + gl_Position = MVP * xyz; - vertexDistance = length((ModelViewMat * vec4(pos + ChunkOffset, 1.0)).xyz); + vertexDistance = length((ProjMat * xyz).xyz); vertexColor = Color * sample_lightmap(Sampler2, UV2); texCoord0 = UV0 * UV_INV; // normal = MVP * vec4(Normal, 0.0); @@ -46,9 +48,9 @@ void main() { //layout(location = 4) in vec3 Normal; //void main() { -// gl_Position = MVP * vec4(Position + ChunkOffset, 1.0); +// gl_Position = MVP * vec4(Position, 1.0); // -// vertexDistance = length((ModelViewMat * vec4(Position + ChunkOffset, 1.0)).xyz); +// vertexDistance = length((ModelViewMat * vec4(Position, 1.0)).xyz); // vertexColor = Color * minecraft_sample_lightmap(Sampler2, UV2); // texCoord0 = UV0; // // normal = MVP * vec4(Normal, 0.0); diff --git a/src/main/resources/assets/vulkanmod/shaders/basic/terrain_indirect/terrain_indirect.fsh b/src/main/resources/assets/vulkanmod/shaders/basic/terrain/terrain_Z.fsh similarity index 65% rename from src/main/resources/assets/vulkanmod/shaders/basic/terrain_indirect/terrain_indirect.fsh rename to src/main/resources/assets/vulkanmod/shaders/basic/terrain/terrain_Z.fsh index 6880c1e94..395172d90 100644 --- a/src/main/resources/assets/vulkanmod/shaders/basic/terrain_indirect/terrain_indirect.fsh +++ b/src/main/resources/assets/vulkanmod/shaders/basic/terrain/terrain_Z.fsh @@ -1,15 +1,13 @@ #version 450 - +layout(early_fragment_tests) in; #include "light.glsl" -layout(binding = 3) uniform sampler2D Sampler0; +layout(binding = 2) uniform sampler2D Sampler0; layout(binding = 1) uniform UBO{ - vec4 ColorModulator; vec4 FogColor; float FogStart; float FogEnd; - float AlphaCutout; }; layout(location = 0) in float vertexDistance; @@ -20,9 +18,6 @@ layout(location = 2) in vec2 texCoord0; layout(location = 0) out vec4 fragColor; void main() { - vec4 color = texture(Sampler0, texCoord0) * vertexColor * ColorModulator; - if (color.a < AlphaCutout) { - discard; - } + vec4 color = texture(Sampler0, texCoord0) * vertexColor; fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor); -} \ No newline at end of file +} diff --git a/src/main/resources/assets/vulkanmod/shaders/basic/terrain_indirect/terrain_indirect.json b/src/main/resources/assets/vulkanmod/shaders/basic/terrain_indirect/terrain_indirect.json deleted file mode 100644 index 9590454c5..000000000 --- a/src/main/resources/assets/vulkanmod/shaders/basic/terrain_indirect/terrain_indirect.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "blend": { - "func": "add", - "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha" - }, - "vertex": "rendertype_solid", - "fragment": "rendertype_solid", - "attributes": [ - "Position", - "Color", - "UV0", - "UV2", - "Normal" - ], - "samplers": [ - { "name": "Sampler0" }, - { "name": "Sampler2" } - ], - "uniforms": [ - { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "ChunkOffset", "type": "float", "count": 3, "values": [ 0.0, 0.0, 0.0 ] }, - { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }, - { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, - { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] }, - { "name": "FogColor", "type": "float", "count": 4, "values": [ 0.0, 0.0, 0.0, 0.0 ] } - ], - "UBOs": [ - { "type": "vertex", "binding": 0, "fields": [ - { "name": "MVP", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] } - ] }, - { "type": "fragment", "binding": 1, "fields": [ - { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }, - { "name": "FogColor", "type": "float", "count": 4, "values": [ 0.0, 0.0, 0.0, 0.0 ] }, - { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, - { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] }, - { "name": "AlphaCutout", "type": "float", "count": 1, "values": [ 1.0 ] } - ] } - ], - "ManualUBOs" : [ - { "type": "vertex", "binding": 2, "size": 2048 } - ] -} diff --git a/src/main/resources/assets/vulkanmod/shaders/basic/terrain_indirect/terrain_indirect.vsh b/src/main/resources/assets/vulkanmod/shaders/basic/terrain_indirect/terrain_indirect.vsh deleted file mode 100644 index b6bfcd991..000000000 --- a/src/main/resources/assets/vulkanmod/shaders/basic/terrain_indirect/terrain_indirect.vsh +++ /dev/null @@ -1,59 +0,0 @@ -#version 460 - -#define MAX_OFFSET_COUNT 512 - -#include "light.glsl" - -layout(binding = 0) uniform UniformBufferObject { - mat4 MVP; - mat4 ModelViewMat; -}; - -layout(binding = 2) uniform UniformBufferObject2 { - vec3 ChunkOffset[MAX_OFFSET_COUNT]; -}; - -layout(binding = 4) uniform sampler2D Sampler2; - -layout(location = 0) out float vertexDistance; -layout(location = 1) out vec4 vertexColor; -layout(location = 2) out vec2 texCoord0; -//layout(location = 3) out vec4 normal; - -//Compressed Vertex - -const float UV_INV = 1.0 / 65536.0; -const float POSITION_INV = 1.0 / 1900.0; - -layout(location = 0) in ivec3 Position; -layout(location = 1) in vec4 Color; -layout(location = 2) in uvec2 UV0; -layout(location = 3) in ivec2 UV2; -//layout(location = 4) in vec3 Normal; - -void main() { - vec3 pos = (Position * POSITION_INV); - gl_Position = MVP * vec4(pos + ChunkOffset[gl_DrawID], 1.0); - - vertexDistance = length((ModelViewMat * vec4(pos + ChunkOffset[gl_DrawID], 1.0)).xyz); - vertexColor = Color * sample_lightmap(Sampler2, UV2); - texCoord0 = UV0 * UV_INV; - // normal = MVP * vec4(Normal, 0.0); -} - -//Default Vertex - -//layout(location = 0) in vec3 Position; -//layout(location = 1) in vec4 Color; -//layout(location = 2) in vec2 UV0; -//layout(location = 3) in ivec2 UV2; -//layout(location = 4) in vec3 Normal; - -//void main() { -// gl_Position = MVP * vec4(Position + ChunkOffset[gl_DrawID], 1.0); -// -// vertexDistance = length((ModelViewMat * vec4(Position + ChunkOffset[gl_DrawID], 1.0)).xyz); -// vertexColor = Color * minecraft_sample_lightmap(Sampler2, UV2); -// texCoord0 = UV0; -// normal = MVP * vec4(Normal, 0.0); -//} \ No newline at end of file diff --git a/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_cutout/rendertype_cutout.json b/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_cutout/rendertype_cutout.json index 341a36a53..962c10ef2 100644 --- a/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_cutout/rendertype_cutout.json +++ b/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_cutout/rendertype_cutout.json @@ -20,7 +20,6 @@ "uniforms": [ { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "ChunkOffset", "type": "float", "count": 3, "values": [ 0.0, 0.0, 0.0 ] }, { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }, { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] }, @@ -37,8 +36,5 @@ { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] } ] } - ], - "PushConstants": [ - { "name": "ChunkOffset", "type": "float", "count": 3, "values": [0.0, 0.0, 0.0] } ] } diff --git a/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_cutout/rendertype_cutout.vsh b/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_cutout/rendertype_cutout.vsh index e3554a98d..f58fd8260 100644 --- a/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_cutout/rendertype_cutout.vsh +++ b/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_cutout/rendertype_cutout.vsh @@ -13,9 +13,7 @@ layout(binding = 0) uniform UniformBufferObject { mat4 ModelViewMat; }; -layout(push_constant) uniform pushConstant { - vec3 ChunkOffset; -}; + layout(binding = 3) uniform sampler2D Sampler2; @@ -25,9 +23,9 @@ layout(location = 2) out vec3 normal; layout(location = 3) out vec2 texCoord0; void main() { - gl_Position = MVP * vec4(Position + ChunkOffset, 1.0); + gl_Position = MVP * vec4(Position, 1.0); - vertexDistance = length((ModelViewMat * vec4(Position + ChunkOffset, 1.0)).xyz); + vertexDistance = length((ModelViewMat * vec4(Position, 1.0)).xyz); vertexColor = Color * minecraft_sample_lightmap(Sampler2, UV2); texCoord0 = UV0; normal = (MVP * vec4(Normal, 0.0)).xyz; @@ -56,9 +54,9 @@ out vec2 texCoord0; out vec4 normal; void main() { - gl_Position = MVP * vec4(Position + ChunkOffset, 1.0); + gl_Position = MVP * vec4(Position, 1.0); - vertexDistance = length((ModelViewMat * vec4(Position + ChunkOffset, 1.0)).xyz); + vertexDistance = length((ModelViewMat * vec4(Position, 1.0)).xyz); vertexColor = Color * minecraft_sample_lightmap(Sampler2, UV2); texCoord0 = UV0; normal = MVP * vec4(Normal, 0.0); diff --git a/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_cutout_mipped/rendertype_cutout_mipped.json b/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_cutout_mipped/rendertype_cutout_mipped.json index d4d830e8b..2453acacf 100644 --- a/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_cutout_mipped/rendertype_cutout_mipped.json +++ b/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_cutout_mipped/rendertype_cutout_mipped.json @@ -20,7 +20,6 @@ "uniforms": [ { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "ChunkOffset", "type": "float", "count": 3, "values": [ 0.0, 0.0, 0.0 ] }, { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }, { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] }, @@ -37,8 +36,5 @@ { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] } ] } - ], - "PushConstants": [ - { "name": "ChunkOffset", "type": "float", "count": 3, "values": [0.0, 0.0, 0.0] } ] } diff --git a/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_cutout_mipped/rendertype_cutout_mipped.vsh b/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_cutout_mipped/rendertype_cutout_mipped.vsh index e3554a98d..f58fd8260 100644 --- a/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_cutout_mipped/rendertype_cutout_mipped.vsh +++ b/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_cutout_mipped/rendertype_cutout_mipped.vsh @@ -13,9 +13,7 @@ layout(binding = 0) uniform UniformBufferObject { mat4 ModelViewMat; }; -layout(push_constant) uniform pushConstant { - vec3 ChunkOffset; -}; + layout(binding = 3) uniform sampler2D Sampler2; @@ -25,9 +23,9 @@ layout(location = 2) out vec3 normal; layout(location = 3) out vec2 texCoord0; void main() { - gl_Position = MVP * vec4(Position + ChunkOffset, 1.0); + gl_Position = MVP * vec4(Position, 1.0); - vertexDistance = length((ModelViewMat * vec4(Position + ChunkOffset, 1.0)).xyz); + vertexDistance = length((ModelViewMat * vec4(Position, 1.0)).xyz); vertexColor = Color * minecraft_sample_lightmap(Sampler2, UV2); texCoord0 = UV0; normal = (MVP * vec4(Normal, 0.0)).xyz; @@ -56,9 +54,9 @@ out vec2 texCoord0; out vec4 normal; void main() { - gl_Position = MVP * vec4(Position + ChunkOffset, 1.0); + gl_Position = MVP * vec4(Position, 1.0); - vertexDistance = length((ModelViewMat * vec4(Position + ChunkOffset, 1.0)).xyz); + vertexDistance = length((ModelViewMat * vec4(Position, 1.0)).xyz); vertexColor = Color * minecraft_sample_lightmap(Sampler2, UV2); texCoord0 = UV0; normal = MVP * vec4(Normal, 0.0); diff --git a/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_solid/rendertype_solid.json b/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_solid/rendertype_solid.json index a88232d14..91ffea76e 100644 --- a/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_solid/rendertype_solid.json +++ b/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_solid/rendertype_solid.json @@ -20,7 +20,6 @@ "uniforms": [ { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "ChunkOffset", "type": "float", "count": 3, "values": [ 0.0, 0.0, 0.0 ] }, { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }, { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] }, @@ -37,8 +36,5 @@ { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] } ] } - ], - "PushConstants": [ - { "name": "ChunkOffset", "type": "float", "count": 3, "values": [0.0, 0.0, 0.0] } ] } diff --git a/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_solid/rendertype_solid.vsh b/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_solid/rendertype_solid.vsh index ea8285929..442085cd7 100644 --- a/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_solid/rendertype_solid.vsh +++ b/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_solid/rendertype_solid.vsh @@ -13,9 +13,7 @@ layout(binding = 0) uniform UniformBufferObject { mat4 ModelViewMat; }; -layout(push_constant) uniform pushConstant { - vec3 ChunkOffset; -}; + layout(binding = 3) uniform sampler2D Sampler2; @@ -25,9 +23,9 @@ layout(location = 2) out vec3 normal; layout(location = 3) out vec2 texCoord0; void main() { - gl_Position = MVP * vec4(Position + ChunkOffset, 1.0); + gl_Position = MVP * vec4(Position, 1.0); - vertexDistance = length((ModelViewMat * vec4(Position + ChunkOffset, 1.0)).xyz); + vertexDistance = length((ModelViewMat * vec4(Position, 1.0)).xyz); vertexColor = Color * minecraft_sample_lightmap(Sampler2, UV2); texCoord0 = UV0; normal = (MVP * vec4(Normal, 0.0)).xyz; @@ -56,9 +54,9 @@ out vec2 texCoord0; out vec4 normal; void main() { - gl_Position = MVP * vec4(Position + ChunkOffset, 1.0); + gl_Position = MVP * vec4(Position, 1.0); - vertexDistance = length((ModelViewMat * vec4(Position + ChunkOffset, 1.0)).xyz); + vertexDistance = length((ModelViewMat * vec4(Position, 1.0)).xyz); vertexColor = Color * minecraft_sample_lightmap(Sampler2, UV2); texCoord0 = UV0; normal = MVP * vec4(Normal, 0.0); diff --git a/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_translucent/rendertype_translucent.json b/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_translucent/rendertype_translucent.json index d06740000..f9bc1a5a1 100644 --- a/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_translucent/rendertype_translucent.json +++ b/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_translucent/rendertype_translucent.json @@ -20,7 +20,6 @@ "uniforms": [ { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "ChunkOffset", "type": "float", "count": 3, "values": [ 0.0, 0.0, 0.0 ] }, { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }, { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] }, @@ -37,8 +36,5 @@ { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] } ] } - ], - "PushConstants": [ - { "name": "ChunkOffset", "type": "float", "count": 3, "values": [0.0, 0.0, 0.0] } ] } diff --git a/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_translucent/rendertype_translucent.vsh b/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_translucent/rendertype_translucent.vsh index f31d8c498..991573ad4 100644 --- a/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_translucent/rendertype_translucent.vsh +++ b/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_translucent/rendertype_translucent.vsh @@ -13,9 +13,7 @@ layout(binding = 0) uniform UniformBufferObject { mat4 ModelViewMat; }; -layout(push_constant) uniform pushConstant { - vec3 ChunkOffset; -}; + layout(binding = 3) uniform sampler2D Sampler2; @@ -25,9 +23,9 @@ layout(location = 1) out vec3 normal; layout(location = 3) out float vertexDistance; void main() { - gl_Position = MVP * vec4(Position + ChunkOffset, 1.0); + gl_Position = MVP * vec4(Position, 1.0); - vertexDistance = length((ModelViewMat * vec4(Position + ChunkOffset, 1.0)).xyz); + vertexDistance = length((ModelViewMat * vec4(Position, 1.0)).xyz); vertexColor = Color * minecraft_sample_lightmap(Sampler2, UV2); texCoord0 = UV0; normal = (MVP * vec4(Normal, 0.0)).xyz; diff --git a/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_tripwire/rendertype_tripwire.json b/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_tripwire/rendertype_tripwire.json index b80441c30..d8bdc835c 100644 --- a/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_tripwire/rendertype_tripwire.json +++ b/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_tripwire/rendertype_tripwire.json @@ -20,7 +20,6 @@ "uniforms": [ { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "ChunkOffset", "type": "float", "count": 3, "values": [ 0.0, 0.0, 0.0 ] }, { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }, { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] }, @@ -37,8 +36,5 @@ { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] } ] } - ], - "PushConstants": [ - { "name": "ChunkOffset", "type": "float", "count": 3, "values": [0.0, 0.0, 0.0] } ] } diff --git a/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_tripwire/rendertype_tripwire.vsh b/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_tripwire/rendertype_tripwire.vsh index c16df3614..44a1e9481 100644 --- a/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_tripwire/rendertype_tripwire.vsh +++ b/src/main/resources/assets/vulkanmod/shaders/minecraft/core/rendertype_tripwire/rendertype_tripwire.vsh @@ -13,9 +13,7 @@ layout(binding = 0) uniform UniformBufferObject { mat4 ModelViewMat; }; -layout(push_constant) uniform pushConstant { - vec3 ChunkOffset; -}; + layout(binding = 3) uniform sampler2D Sampler2; @@ -25,9 +23,9 @@ layout(location = 1) out vec3 normal; layout(location = 3) out float vertexDistance; void main() { - gl_Position = MVP * vec4(Position + ChunkOffset, 1.0); + gl_Position = MVP * vec4(Position, 1.0); - vertexDistance = length((ModelViewMat * vec4(Position + ChunkOffset, 1.0)).xyz); + vertexDistance = length((ModelViewMat * vec4(Position, 1.0)).xyz); vertexColor = Color * minecraft_sample_lightmap(Sampler2, UV2); texCoord0 = UV0; normal = (MVP * vec4(Normal, 0.0)).xyz; @@ -56,9 +54,9 @@ out vec2 texCoord0; out vec4 normal; void main() { - gl_Position = MVP * vec4(Position + ChunkOffset, 1.0); + gl_Position = MVP * vec4(Position, 1.0); - vertexDistance = length((ModelViewMat * vec4(Position + ChunkOffset, 1.0)).xyz); + vertexDistance = length((ModelViewMat * vec4(Position, 1.0)).xyz); vertexColor = Color * minecraft_sample_lightmap(Sampler2, UV2); texCoord0 = UV0; normal = MVP * vec4(Normal, 0.0); diff --git a/src/main/resources/vulkanmod.accesswidener b/src/main/resources/vulkanmod.accesswidener index 53bb63805..89da0b18b 100644 --- a/src/main/resources/vulkanmod.accesswidener +++ b/src/main/resources/vulkanmod.accesswidener @@ -10,4 +10,5 @@ accessible class net/minecraft/client/gui/Gui$HeartType accessible class net/minecraft/client/renderer/OutlineBufferSource$EntityOutlineGenerator #1.20 -accessible field com/mojang/blaze3d/systems/RenderSystem vertexSorting Lcom/mojang/blaze3d/vertex/VertexSorting; \ No newline at end of file +accessible field com/mojang/blaze3d/systems/RenderSystem vertexSorting Lcom/mojang/blaze3d/vertex/VertexSorting; +accessible field net/minecraft/client/renderer/RenderStateShard name Ljava/lang/String; \ No newline at end of file