Начинающий
Начинающий
- Статус
- Оффлайн
- Регистрация
- 23 Мар 2025
- Сообщения
- 61
- Реакции
- 0
блюр с рокстара хавает фпс 400 +- , как можно переписать его?
InGameHudMixin:
BlurProgram:
KawaseBlurProgram:
сам шейдер не кидаю тк будет много контента, если надо будет можете попросить в теме , скину вам или просто посмотреть его в слитых исходниках
InGameHudMixin:
Код:
@Inject(method = "renderMainHud", at = @At("TAIL"))
private void triggerHudRenderEvent(DrawContext context, RenderTickCounter tickCounter, CallbackInfo ci) {
CustomDrawContext customDrawContext = CustomDrawContext.of(context);
DrawUtility.blurProgram.draw();
Rockstar.getInstance().getEventManager().triggerEvent(new HudRenderEvent(customDrawContext, tickCounter.getTickDelta(false)));
}
}
BlurProgram:
Код:
package moscow.rockstar.framework.shader.impl;
import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import com.mojang.blaze3d.systems.RenderSystem;
import lombok.Generated;
import moscow.rockstar.Rockstar;
import moscow.rockstar.utility.interfaces.IMinecraft;
import moscow.rockstar.utility.interfaces.IWindow;
import moscow.rockstar.utility.render.CustomRenderTarget;
import moscow.rockstar.utility.time.Timer;
import net.minecraft.client.gl.Framebuffer;
import net.minecraft.client.render.BufferBuilder;
import net.minecraft.client.render.BufferRenderer;
import net.minecraft.client.render.VertexFormats;
import net.minecraft.client.render.VertexFormat.DrawMode;
public class BlurProgram implements IMinecraft, IWindow {
private static final Framebuffer MAIN_FBO = mc.getFramebuffer();
public static final Supplier<CustomRenderTarget> CACHE = Suppliers.memoize(() -> new CustomRenderTarget(false).setLinear());
public static final Supplier<CustomRenderTarget> BUFFER = Suppliers.memoize(() -> new CustomRenderTarget(false).setLinear());
private final Timer timer = new Timer();
private static KawaseBlurProgram kawaseDownProgram;
private static KawaseBlurProgram kawaseUpProgram;
private float blurOffset = 1.0F;
private float blurDownscale = 0.5F;
public void initShaders() {
kawaseDownProgram = new KawaseBlurProgram(Rockstar.id("kawase_down/data"));
kawaseUpProgram = new KawaseBlurProgram(Rockstar.id("kawase_up/data"));
}
public void draw() {
if (this.timer.finished(25L)) {
this.blurOffset = 1.0F;
CustomRenderTarget cache = (CustomRenderTarget)CACHE.get();
CustomRenderTarget buffer = (CustomRenderTarget)BUFFER.get();
cache.setDownscale(this.blurDownscale).setLinear();
buffer.setDownscale(this.blurDownscale).setLinear();
RenderSystem.enableBlend();
RenderSystem.defaultBlendFunc();
kawaseDownProgram.use();
kawaseDownProgram.updateUniforms(this.blurOffset, MAIN_FBO.textureWidth, MAIN_FBO.textureHeight);
cache.setup();
MAIN_FBO.beginRead();
RenderSystem.setShaderTexture(0, MAIN_FBO.getColorAttachment());
this.drawQuad(0.0F, 0.0F, mw.getScaledWidth(), mw.getScaledHeight());
cache.stop();
CustomRenderTarget[] buffers = new CustomRenderTarget[]{cache, buffer};
int steps = 3;
for (int i = 1; i < 3; i++) {
int step = i % 2;
buffers[step].setup();
buffers[(step + 1) % 2].beginRead();
RenderSystem.setShaderTexture(0, buffers[(step + 1) % 2].getColorAttachment());
kawaseDownProgram.updateUniforms(this.blurOffset, buffers[(step + 1) % 2].textureWidth, buffers[(step + 1) % 2].textureHeight);
this.drawQuad(0.0F, 0.0F, mw.getScaledWidth(), mw.getScaledHeight());
buffers[(step + 1) % 2].endRead();
buffers[step].stop();
}
kawaseUpProgram.use();
for (int i = 0; i < 3; i++) {
int step = i % 2;
buffers[(step + 1) % 2].setup();
buffers[step].beginRead();
RenderSystem.setShaderTexture(0, buffers[step].getColorAttachment());
kawaseUpProgram.updateUniforms(this.blurOffset, buffers[step].textureWidth, buffers[step].textureHeight);
this.drawQuad(0.0F, 0.0F, mw.getScaledWidth(), mw.getScaledHeight());
buffers[step].endRead();
buffers[step].stop();
}
MAIN_FBO.endRead();
MAIN_FBO.beginWrite(false);
RenderSystem.setShaderTexture(0, 0);
RenderSystem.disableBlend();
}
}
private void drawQuad(float x, float y, float width, float height) {
int color = -1;
BufferBuilder builder = RenderSystem.renderThreadTesselator().begin(DrawMode.QUADS, VertexFormats.POSITION_TEXTURE_COLOR);
builder.vertex(x, y, 0.0F).texture(0.0F, 1.0F).color(color);
builder.vertex(x, y + height, 0.0F).texture(0.0F, 0.0F).color(color);
builder.vertex(x + width, y + height, 0.0F).texture(1.0F, 0.0F).color(color);
builder.vertex(x + width, y, 0.0F).texture(1.0F, 1.0F).color(color);
BufferRenderer.drawWithGlobalProgram(builder.end());
}
public static int getTexture() {
return ((CustomRenderTarget)BUFFER.get()).getColorAttachment();
}
@Generated
public void setBlurOffset(float blurOffset) {
this.blurOffset = blurOffset;
}
@Generated
public void setBlurDownscale(float blurDownscale) {
this.blurDownscale = blurDownscale;
}
}
KawaseBlurProgram:
Код:
package moscow.rockstar.framework.shader.impl;
import moscow.rockstar.framework.shader.GlProgram;
import moscow.rockstar.utility.interfaces.IWindow;
import net.minecraft.client.gl.GlUniform;
import net.minecraft.client.render.VertexFormats;
import net.minecraft.util.Identifier;
public class KawaseBlurProgram extends GlProgram implements IWindow {
private GlUniform resolutionUniform;
private GlUniform offsetUniform;
private GlUniform saturationUniform;
private GlUniform tintIntensityUniform;
private GlUniform tintColorUniform;
public KawaseBlurProgram(Identifier identifier) {
super(identifier, VertexFormats.POSITION_TEXTURE_COLOR);
}
public void updateUniforms(float offset) {
this.offsetUniform.set(offset);
this.resolutionUniform.set(1.0F / mw.getScaledWidth(), 1.0F / mw.getScaledHeight());
this.saturationUniform.set(1.0F);
this.tintIntensityUniform.set(0.0F);
this.tintColorUniform.set(1.0F, 1.0F, 1.0F);
}
public void updateUniforms(float offset, int textureWidth, int textureHeight) {
this.offsetUniform.set(offset);
float invW = textureWidth > 0 ? 1.0F / textureWidth : 0.0F;
float invH = textureHeight > 0 ? 1.0F / textureHeight : 0.0F;
this.resolutionUniform.set(invW, invH);
this.saturationUniform.set(1.0F);
this.tintIntensityUniform.set(0.0F);
this.tintColorUniform.set(1.0F, 1.0F, 1.0F);
}
@Override
protected void setup() {
this.resolutionUniform = this.findUniform("Resolution");
this.offsetUniform = this.findUniform("Offset");
this.saturationUniform = this.findUniform("Saturation");
this.tintIntensityUniform = this.findUniform("TintIntensity");
this.tintColorUniform = this.findUniform("TintColor");
super.setup();
}
}
сам шейдер не кидаю тк будет много контента, если надо будет можете попросить в теме , скину вам или просто посмотреть его в слитых исходниках
Последнее редактирование: