Начинающий
- Статус
- Онлайн
- Регистрация
- 30 Июн 2024
- Сообщения
- 777
- Реакции
- 14
делаю чисто для себя. Я уже хуй знает что мне с ним делать, не появляется там преломление(искажение к краям) шейдеры вот
вроде всё
Код:
#version 150
#moj_import <mre:common.glsl>
in vec2 FragCoord;
in vec2 TexCoord;
in vec4 FragColor;
uniform sampler2D Sampler0;
uniform vec2 Size;
uniform vec4 Radius;
uniform float Smoothness;
uniform float CornerSmoothness;
uniform float GlobalAlpha;
uniform float FresnelPower;
uniform vec3 FresnelColor;
uniform float FresnelAlpha;
uniform float BaseAlpha;
uniform bool FresnelInvert;
uniform float FresnelMix;
uniform float DistortStrength;
out vec4 OutColor;
float roundedBoxSDF(vec2 p, vec2 b, vec4 r, float smoothness) {
r.xy = (p.x > 0.0) ? r.xy : r.zw;
r.x = (p.y > 0.0) ? r.x : r.y;
vec2 q = abs(p) - b + r.x;
vec2 q_clamped = max(q, 0.0);
float len = pow(pow(q_clamped.x, smoothness) + pow(q_clamped.y, smoothness), 1.0/smoothness);
return min(max(q.x, q.y), 0.0) + len - r.x;
}
void main() {
vec2 center = Size * 0.5;
vec2 box_half_size = center - 1.0;
vec2 pos = (FragCoord * Size) - center;
float distance = roundedBoxSDF(-pos, box_half_size, Radius, CornerSmoothness);
float alpha = 1.0 - smoothstep(1.0 - Smoothness, 1.0, distance);
float distToEdge = abs(roundedBoxSDF(pos, box_half_size, Radius, CornerSmoothness));
float max_dist_norm = min(box_half_size.x, box_half_size.y);
float edge_gradient = 1.0 - clamp(distToEdge / max_dist_norm, 0.0, 1.0);
float fresnel;
float base = FresnelInvert ? edge_gradient : (1.0 - edge_gradient);
if (FresnelPower > 20.0) {
fresnel = exp(FresnelPower * log(clamp(base, 0.001, 1.0)));
} else {
fresnel = pow(base, FresnelPower);
}
fresnel = clamp(fresnel, 0.0, 1.0);
vec2 dir = normalize(pos);
vec2 distortedTexCoord = TexCoord + dir * fresnel * DistortStrength;
vec4 texColor = texture(Sampler0, distortedTexCoord) * FragColor;
vec3 finalColor = mix(texColor.rgb, FresnelColor, fresnel * FresnelMix);
float finalAlpha = mix(BaseAlpha, FresnelAlpha, fresnel) * alpha;
if (finalAlpha < 0.001) {
discard;
}
OutColor = vec4(finalColor, finalAlpha * GlobalAlpha);
}
Код:
{
"vertex": "mre:core/liquidglass/vertex",
"fragment": "mre:core/liquidglass/fragment",
"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": "Size",
"type": "float",
"count": 2,
"values": [0.0, 0.0]
},
{
"name": "Radius",
"type": "float",
"count": 4,
"values": [0.0, 0.0, 0.0, 0.0]
},
{
"name": "Smoothness",
"type": "float",
"count": 1,
"values": [1.0]
},
{
"name": "CornerSmoothness",
"type": "float",
"count": 1,
"values": [2.0]
},
{
"name": "GlobalAlpha",
"type": "float",
"count": 1,
"values": [1.0]
},
{
"name": "FresnelPower",
"type": "float",
"count": 1,
"values": [2.0]
},
{
"name": "FresnelColor",
"type": "float",
"count": 3,
"values": [1.0, 1.0, 1.0]
},
{
"name": "FresnelAlpha",
"type": "float",
"count": 1,
"values": [0.8]
},
{
"name": "BaseAlpha",
"type": "float",
"count": 1,
"values": [0.2]
},
{
"name": "FresnelInvert",
"type": "int",
"count": 1,
"values": [0]
},
{
"name": "FresnelMix",
"type": "float",
"count": 1,
"values": [1.0]
},
{
"name": "DistortStrength",
"type": "float",
"count": 1,
"values": [0.03]
}
]
}
Код:
#version 150
#moj_import <mre:common.glsl>
in vec3 Position;
in vec2 UV0;
in vec4 Color;
uniform mat4 ModelViewMat;
uniform mat4 ProjMat;
out vec2 FragCoord;
out vec2 TexCoord;
out vec4 FragColor;
void main() {
gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0);
FragCoord = rvertexcoord(gl_VertexID);
TexCoord = UV0;
FragColor = Color;
}
Код:
package fun.rich.utils.display.shape.implement;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.gl.*;
import net.minecraft.client.render.BufferBuilder;
import net.minecraft.client.render.BufferRenderer;
import net.minecraft.client.render.VertexFormat;
import net.minecraft.client.render.VertexFormats;
import net.minecraft.util.Identifier;
import org.joml.Matrix4f;
import org.joml.Vector2f;
import org.joml.Vector3f;
import org.joml.Vector4f;
import org.lwjgl.opengl.GL13;
import fun.rich.utils.display.shape.Shape;
import fun.rich.utils.display.shape.ShapeProperties;
import fun.rich.utils.display.interfaces.QuickImports;
import fun.rich.utils.display.color.ColorAssist;
public class LiquidGlass implements Shape, QuickImports {
private final ShaderProgramKey SHADER_KEY = new ShaderProgramKey(Identifier.of("minecraft", "core/blur"), VertexFormats.POSITION, Defines.EMPTY);
public Framebuffer input;
public Vector2f resolution = new Vector2f();
private float smoothness = 1.0f;
private float cornerSmoothness = 2.0f;
private float globalAlpha = 1.0f;
private float fresnelPower = 2.0f;
private float fresnelAlpha = 0.8f;
private float baseAlpha = 0.2f;
private float distortStrength = 0.05f;
private boolean fresnelInvert = false;
private float fresnelMix = 1.0f;
private float fresnelColorR = 1.0f;
private float fresnelColorG = 1.0f;
private float fresnelColorB = 1.0f;
@Override
public void render(ShapeProperties shape) {
RenderSystem.enableBlend();
RenderSystem.defaultBlendFunc();
RenderSystem.enableDepthTest();
RenderSystem.enableCull();
float scale = (float) mc.getWindow().getScaleFactor();
float alpha = RenderSystem.getShaderColor()[3];
Matrix4f matrix4f = shape.getMatrix().peek().getPositionMatrix();
Vector3f pos = matrix4f.transformPosition(shape.getX(), shape.getY(), 0, new Vector3f()).mul(scale);
Vector3f size = matrix4f.getScale(new Vector3f()).mul(scale);
Vector4f round = shape.getRound().mul(size.y);
float quality = shape.getQuality();
float softness = shape.getSoftness();
float thickness = shape.getThickness();
float width = shape.getWidth() * size.x;
float height = shape.getHeight() * size.y;
BufferBuilder buffer = tessellator.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION);
drawEngine.quad(matrix4f, buffer, shape.getX() - softness / 2, shape.getY() - softness / 2, shape.getWidth() + softness, shape.getHeight() + softness);
GlStateManager._activeTexture(GL13.GL_TEXTURE0);
if (input != null) RenderSystem.bindTexture(input.getColorAttachment());
ShaderProgram shader = RenderSystem.setShader(SHADER_KEY);
shader.getUniformOrDefault("size").set(width, height);
shader.getUniformOrDefault("location").set(pos.x, window.getHeight() - height - pos.y);
shader.getUniformOrDefault("radius").set(round);
shader.getUniformOrDefault("softness").set(softness);
shader.getUniformOrDefault("thickness").set(thickness);
shader.getUniformOrDefault("Quality").set(quality);
shader.getUniformOrDefault("color1").set(ColorAssist.redf(shape.getColor().x), ColorAssist.greenf(shape.getColor().x), ColorAssist.bluef(shape.getColor().x), ColorAssist.alphaf(ColorAssist.multAlpha(shape.getColor().x, alpha)));
shader.getUniformOrDefault("color2").set(ColorAssist.redf(shape.getColor().y), ColorAssist.greenf(shape.getColor().y), ColorAssist.bluef(shape.getColor().y), ColorAssist.alphaf(ColorAssist.multAlpha(shape.getColor().y, alpha)));
shader.getUniformOrDefault("color3").set(ColorAssist.redf(shape.getColor().z), ColorAssist.greenf(shape.getColor().z), ColorAssist.bluef(shape.getColor().z), ColorAssist.alphaf(ColorAssist.multAlpha(shape.getColor().z, alpha)));
shader.getUniformOrDefault("color4").set(ColorAssist.redf(shape.getColor().w), ColorAssist.greenf(shape.getColor().w), ColorAssist.bluef(shape.getColor().w), ColorAssist.alphaf(ColorAssist.multAlpha(shape.getColor().w, alpha)));
shader.getUniformOrDefault("outlineColor").set(ColorAssist.redf(shape.getOutlineColor()), ColorAssist.greenf(shape.getOutlineColor()), ColorAssist.bluef(shape.getOutlineColor()), ColorAssist.alphaf(ColorAssist.multAlpha(shape.getOutlineColor(), alpha)));
shader.getUniformOrDefault("InputResolution").set(resolution.x, resolution.y);
BufferRenderer.drawWithGlobalProgram(buffer.end());
RenderSystem.disableBlend();
}
public void setup() {
Framebuffer buffer = mc.getFramebuffer();
if (input == null) {
input = new SimpleFramebuffer(mc.getWindow().getScaledWidth(), mc.getWindow().getScaledHeight(), false);
}
input.beginWrite(false);
buffer.draw(input.textureWidth, input.textureHeight);
buffer.beginWrite(false);
if (input != null && (input.textureWidth != mc.getWindow().getFramebufferWidth() || input.textureHeight != mc.getWindow().getFramebufferHeight())) {
input.resize(mc.getWindow().getFramebufferWidth(), mc.getWindow().getFramebufferHeight());
}
resolution.set((float) buffer.textureWidth, (float) buffer.textureHeight);
}
public LiquidGlass setSmoothness(float smoothness) {
this.smoothness = smoothness;
return this;
}
public LiquidGlass setCornerSmoothness(float cornerSmoothness) {
this.cornerSmoothness = cornerSmoothness;
return this;
}
public LiquidGlass setGlobalAlpha(float globalAlpha) {
this.globalAlpha = globalAlpha;
return this;
}
public LiquidGlass setFresnelPower(float fresnelPower) {
this.fresnelPower = fresnelPower;
return this;
}
public LiquidGlass setFresnelAlpha(float fresnelAlpha) {
this.fresnelAlpha = fresnelAlpha;
return this;
}
public LiquidGlass setBaseAlpha(float baseAlpha) {
this.baseAlpha = baseAlpha;
return this;
}
public LiquidGlass setDistortStrength(float distortStrength) {
this.distortStrength = distortStrength;
return this;
}
public LiquidGlass setFresnelInvert(boolean fresnelInvert) {
this.fresnelInvert = fresnelInvert;
return this;
}
public LiquidGlass setFresnelMix(float fresnelMix) {
this.fresnelMix = fresnelMix;
return this;
}
public LiquidGlass setFresnelColor(float r, float g, float b) {
this.fresnelColorR = r;
this.fresnelColorG = g;
this.fresnelColorB = b;
return this;
}
}