Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос Оптимизация fabric 1.21.4

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
23 Мар 2025
Сообщения
61
Реакции
0
блюр с рокстара хавает фпс 400 +- , как можно переписать его?

InGameHudMixin:

Код:
Expand Collapse Copy
   @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:

Код:
Expand Collapse Copy
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:

Код:
Expand Collapse Copy
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();
   }
}

сам шейдер не кидаю тк будет много контента, если надо будет можете попросить в теме , скину вам или просто посмотреть его в слитых исходниках
 
Последнее редактирование:
Назад
Сверху Снизу