Add custom position/tex/color shader without fragment discarding

This commit is contained in:
DBotThePony 2023-07-15 19:35:38 +07:00
parent f5a9e98c6f
commit 57b2b64ff9
Signed by: DBot
GPG Key ID: DCC23B5715498507
5 changed files with 76 additions and 1 deletions

View File

@ -1,11 +1,13 @@
package ru.dbotthepony.mc.otm.mixin; package ru.dbotthepony.mc.otm.mixin;
import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.server.packs.resources.ResourceProvider;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import ru.dbotthepony.mc.otm.client.render.GlitchRenderer; import ru.dbotthepony.mc.otm.client.render.GlitchRenderer;
import ru.dbotthepony.mc.otm.client.render.RenderHelperKt;
@Mixin(GameRenderer.class) @Mixin(GameRenderer.class)
public class MixinGameRenderer { public class MixinGameRenderer {
@ -19,4 +21,12 @@ public class MixinGameRenderer {
private void render(float p_109094_, long p_109095_, boolean p_109096_, CallbackInfo ci) { private void render(float p_109094_, long p_109095_, boolean p_109096_, CallbackInfo ci) {
GlitchRenderer.render(); GlitchRenderer.render();
} }
@Inject(
method = "reloadShaders(Lnet/minecraft/server/packs/resources/ResourceProvider;)V",
at = @At("HEAD")
)
private void reloadShaders(ResourceProvider p_250719_, CallbackInfo ci) {
RenderHelperKt.reloadShaders(p_250719_);
}
} }

View File

@ -8,11 +8,14 @@ import net.minecraft.client.renderer.GameRenderer
import net.minecraft.client.renderer.RenderStateShard import net.minecraft.client.renderer.RenderStateShard
import net.minecraft.client.renderer.RenderStateShard.LineStateShard import net.minecraft.client.renderer.RenderStateShard.LineStateShard
import net.minecraft.client.renderer.RenderType import net.minecraft.client.renderer.RenderType
import net.minecraft.client.renderer.ShaderInstance
import net.minecraft.client.renderer.texture.TextureAtlasSprite import net.minecraft.client.renderer.texture.TextureAtlasSprite
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.server.packs.resources.ResourceProvider
import org.joml.Matrix4f import org.joml.Matrix4f
import org.lwjgl.opengl.GL11.GL_ALWAYS import org.lwjgl.opengl.GL11.GL_ALWAYS
import org.lwjgl.opengl.GL11.GL_LESS import org.lwjgl.opengl.GL11.GL_LESS
import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.client.minecraft
import ru.dbotthepony.mc.otm.core.math.RGBAColor import ru.dbotthepony.mc.otm.core.math.RGBAColor
import java.util.* import java.util.*
@ -23,6 +26,7 @@ import kotlin.math.cos
import kotlin.math.pow import kotlin.math.pow
import kotlin.math.roundToInt import kotlin.math.roundToInt
import kotlin.math.sin import kotlin.math.sin
import kotlin.properties.Delegates
var is3DContext = false var is3DContext = false
@ -35,6 +39,13 @@ var lockBlendFunc = false
private val defaultUV = UVCoords(0f, 0f, 1f, 1f) private val defaultUV = UVCoords(0f, 0f, 1f, 1f)
var customTexColorShader: ShaderInstance by Delegates.notNull()
private set
fun reloadShaders(provider: ResourceProvider) {
customTexColorShader = ShaderInstance(provider, ResourceLocation(OverdriveThatMatters.MOD_ID, "position_tex_color"), DefaultVertexFormat.POSITION_TEX_COLOR)
}
fun renderRect( fun renderRect(
matrix: Matrix4f, matrix: Matrix4f,
x: Float, x: Float,
@ -108,7 +119,7 @@ fun renderTexturedRect(
if (color.isWhite) if (color.isWhite)
RenderSystem.setShader(GameRenderer::getPositionTexShader) RenderSystem.setShader(GameRenderer::getPositionTexShader)
else else
RenderSystem.setShader(GameRenderer::getPositionTexColorShader) RenderSystem.setShader { customTexColorShader }
if (texture != null) if (texture != null)
RenderSystem.setShaderTexture(0, texture) RenderSystem.setShaderTexture(0, texture)

View File

@ -0,0 +1,14 @@
#version 150
uniform sampler2D Sampler0;
uniform vec4 ColorModulator;
in vec2 texCoord0;
in vec4 vertexColor;
out vec4 fragColor;
void main() {
fragColor = texture(Sampler0, texCoord0) * vertexColor * ColorModulator;
}

View File

@ -0,0 +1,22 @@
{
"blend": {
"func": "add",
"srcrgb": "srcalpha",
"dstrgb": "1-srcalpha"
},
"vertex": "overdrive_that_matters:position_tex_color",
"fragment": "overdrive_that_matters:position_tex_color",
"attributes": [
"Position",
"UV0",
"Color"
],
"samplers": [
{ "name": "Sampler0" }
],
"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": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }
]
}

View File

@ -0,0 +1,18 @@
#version 150
in vec3 Position;
in vec2 UV0;
in vec4 Color;
uniform mat4 ModelViewMat;
uniform mat4 ProjMat;
out vec2 texCoord0;
out vec4 vertexColor;
void main() {
gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0);
texCoord0 = UV0;
vertexColor = Color;
}