Fixed Sky rendering errors

This commit is contained in:
Frank 2022-05-17 23:08:25 +02:00
parent c66a1a1824
commit adfe267cd3

View file

@ -1,5 +1,6 @@
package ru.betterend.client.render; package ru.betterend.client.render;
import com.mojang.blaze3d.platform.GlDebug;
import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.BufferBuilder;
@ -16,6 +17,8 @@ import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
import net.minecraft.client.renderer.FogRenderer; import net.minecraft.client.renderer.FogRenderer;
import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import org.lwjgl.opengl.GLDebugMessageAMDCallback;
import ru.bclib.util.BackgroundInfo; import ru.bclib.util.BackgroundInfo;
import ru.bclib.util.MHelper; import ru.bclib.util.MHelper;
import ru.betterend.BetterEnd; import ru.betterend.BetterEnd;
@ -25,6 +28,10 @@ import net.minecraft.util.RandomSource;
import net.minecraft.world.level.levelgen.LegacyRandomSource; import net.minecraft.world.level.levelgen.LegacyRandomSource;
public class BetterEndSkyRenderer implements DimensionRenderingRegistry.SkyRenderer { public class BetterEndSkyRenderer implements DimensionRenderingRegistry.SkyRenderer {
@FunctionalInterface
static interface BufferFunction {
void make(BufferBuilder bufferBuilder, double minSize, double maxSize, int count, long seed);
}
private static final ResourceLocation NEBULA_1 = BetterEnd.makeID("textures/sky/nebula_2.png"); private static final ResourceLocation NEBULA_1 = BetterEnd.makeID("textures/sky/nebula_2.png");
private static final ResourceLocation NEBULA_2 = BetterEnd.makeID("textures/sky/nebula_3.png"); private static final ResourceLocation NEBULA_2 = BetterEnd.makeID("textures/sky/nebula_3.png");
private static final ResourceLocation HORIZON = BetterEnd.makeID("textures/sky/nebula_1.png"); private static final ResourceLocation HORIZON = BetterEnd.makeID("textures/sky/nebula_1.png");
@ -157,93 +164,59 @@ public class BetterEndSkyRenderer implements DimensionRenderingRegistry.SkyRende
private void renderBuffer(PoseStack matrices, Matrix4f matrix4f, VertexBuffer buffer, VertexFormat format, float r, float g, float b, float a) { private void renderBuffer(PoseStack matrices, Matrix4f matrix4f, VertexBuffer buffer, VertexFormat format, float r, float g, float b, float a) {
RenderSystem.setShaderColor(r, g, b, a); RenderSystem.setShaderColor(r, g, b, a);
buffer.bind();
if (format == DefaultVertexFormat.POSITION) { if (format == DefaultVertexFormat.POSITION) {
buffer.drawWithShader(matrices.last().pose(), matrix4f, GameRenderer.getPositionShader()); buffer.drawWithShader(matrices.last().pose(), matrix4f, GameRenderer.getPositionShader());
} }
else { else {
buffer.drawWithShader(matrices.last().pose(), matrix4f, GameRenderer.getPositionTexShader()); buffer.drawWithShader(matrices.last().pose(), matrix4f, GameRenderer.getPositionTexShader());
} }
VertexBuffer.unbind();
} }
private void initStars() { private void initStars() {
BufferBuilder buffer = Tesselator.getInstance().getBuilder(); BufferBuilder buffer = Tesselator.getInstance().getBuilder();
stars1 = buildBufferStars(buffer, stars1, 0.1, 0.30, 3500, 41315); stars1 = buildBuffer(buffer, stars1, 0.1, 0.30, 3500, 41315, this::makeStars);
stars2 = buildBufferStars(buffer, stars2, 0.1, 0.35, 2000, 35151); stars2 = buildBuffer(buffer, stars2, 0.1, 0.35, 2000, 35151, this::makeStars);
stars3 = buildBufferUVStars(buffer, stars3, 0.4, 1.2, 1000, 61354); stars3 = buildBuffer(buffer, stars3, 0.4, 1.2, 1000, 61354, this::makeUVStars);
stars4 = buildBufferUVStars(buffer, stars4, 0.4, 1.2, 1000, 61355); stars4 = buildBuffer(buffer, stars4, 0.4, 1.2, 1000, 61355, this::makeUVStars);
nebula1 = buildBufferFarFog(buffer, nebula1, 40, 60, 30, 11515); nebula1 = buildBuffer(buffer, nebula1, 40, 60, 30, 11515, this::makeFarFog);
nebula2 = buildBufferFarFog(buffer, nebula2, 40, 60, 10, 14151); nebula2 = buildBuffer(buffer, nebula2, 40, 60, 10, 14151, this::makeFarFog);
horizon = buildBufferHorizon(buffer, horizon); horizon = buildBufferHorizon(buffer, horizon);
fog = buildBufferFog(buffer, fog); fog = buildBufferFog(buffer, fog);
} }
private VertexBuffer buildBufferStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) { private VertexBuffer buildBuffer(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed, BufferFunction fkt) {
if (buffer != null) { if (buffer != null) {
buffer.close(); buffer.close();
} }
buffer = new VertexBuffer(); buffer = new VertexBuffer();
makeStars(bufferBuilder, minSize, maxSize, count, seed); fkt.make(bufferBuilder, minSize, maxSize, count, seed);
BufferBuilder.RenderedBuffer renderedBuffer = bufferBuilder.end(); BufferBuilder.RenderedBuffer renderedBuffer = bufferBuilder.end();
buffer.bind();
buffer.upload(renderedBuffer); buffer.upload(renderedBuffer);
return buffer; return buffer;
} }
private VertexBuffer buildBufferUVStars(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) {
if (buffer != null) {
buffer.close();
}
buffer = new VertexBuffer();
makeUVStars(bufferBuilder, minSize, maxSize, count, seed);
BufferBuilder.RenderedBuffer renderedBuffer = bufferBuilder.end();
buffer.upload(renderedBuffer);
return buffer;
}
private VertexBuffer buildBufferFarFog(BufferBuilder bufferBuilder, VertexBuffer buffer, double minSize, double maxSize, int count, long seed) {
if (buffer != null) {
buffer.close();
}
buffer = new VertexBuffer();
makeFarFog(bufferBuilder, minSize, maxSize, count, seed);
BufferBuilder.RenderedBuffer renderedBuffer = bufferBuilder.end();
buffer.upload(renderedBuffer);
return buffer;
}
private VertexBuffer buildBufferHorizon(BufferBuilder bufferBuilder, VertexBuffer buffer) { private VertexBuffer buildBufferHorizon(BufferBuilder bufferBuilder, VertexBuffer buffer) {
if (buffer != null) { return buildBuffer(
buffer.close(); bufferBuilder, buffer, 0, 0, 0, 0,
} (_builder, _minSize, _maxSize, _count, _seed)->makeCylinder(_builder, 16, 50, 100));
buffer = new VertexBuffer();
makeCylinder(bufferBuilder, 16, 50, 100);
BufferBuilder.RenderedBuffer renderedBuffer = bufferBuilder.end();
buffer.upload(renderedBuffer);
return buffer;
} }
private VertexBuffer buildBufferFog(BufferBuilder bufferBuilder, VertexBuffer buffer) { private VertexBuffer buildBufferFog(BufferBuilder bufferBuilder, VertexBuffer buffer) {
if (buffer != null) { return buildBuffer(
buffer.close(); bufferBuilder, buffer, 0, 0, 0, 0,
} (_builder, _minSize, _maxSize, _count, _seed)->makeCylinder(_builder, 16, 50, 70));
buffer = new VertexBuffer();
makeCylinder(bufferBuilder, 16, 50, 70);
BufferBuilder.RenderedBuffer renderedBuffer = bufferBuilder.end();
buffer.upload(renderedBuffer);
return buffer;
} }
private void makeStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { private void makeStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) {
RandomSource random = new LegacyRandomSource(seed); RandomSource random = new LegacyRandomSource(seed);
RenderSystem.setShader(GameRenderer::getPositionShader);
buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION); buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION);
for (int i = 0; i < count; ++i) { for (int i = 0; i < count; ++i) {
@ -290,6 +263,7 @@ public class BetterEndSkyRenderer implements DimensionRenderingRegistry.SkyRende
private void makeUVStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { private void makeUVStars(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) {
RandomSource random = new LegacyRandomSource(seed); RandomSource random = new LegacyRandomSource(seed);
RenderSystem.setShader(GameRenderer::getPositionTexShader);
buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX);
for (int i = 0; i < count; ++i) { for (int i = 0; i < count; ++i) {
@ -339,6 +313,7 @@ public class BetterEndSkyRenderer implements DimensionRenderingRegistry.SkyRende
private void makeFarFog(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) { private void makeFarFog(BufferBuilder buffer, double minSize, double maxSize, int count, long seed) {
RandomSource random = new LegacyRandomSource(seed); RandomSource random = new LegacyRandomSource(seed);
RenderSystem.setShader(GameRenderer::getPositionTexShader);
buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX);
for (int i = 0; i < count; ++i) { for (int i = 0; i < count; ++i) {
@ -388,6 +363,7 @@ public class BetterEndSkyRenderer implements DimensionRenderingRegistry.SkyRende
} }
private void makeCylinder(BufferBuilder buffer, int segments, double height, double radius) { private void makeCylinder(BufferBuilder buffer, int segments, double height, double radius) {
RenderSystem.setShader(GameRenderer::getPositionTexShader);
buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX);
for (int i = 0; i < segments; i++) { for (int i = 0; i < segments; i++) {
double a1 = (double) i * Math.PI * 2.0 / (double) segments; double a1 = (double) i * Math.PI * 2.0 / (double) segments;