如何在1.12.2中正确管理GL的渲染状态?

查看数: 153 | 评论数: 4 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2025-1-26 02:09

正文摘要:

本帖最后由 OpenKFC 于 2025-1-26 02:52 编辑 直接用如下的代码监听RenderGameOverlayEvent.Post事件便会出现bug:    @SubscribeEvent     public static void onPostRenderGameOverlay(Ren ...

回复

OpenKFC 发表于 5 天前
目前想到的解决办法……

  1. public class GlAttribModel implements AutoCloseable {
  2.     boolean alpha = GL11.glGetBoolean(GL11.GL_ALPHA_TEST);
  3.     boolean blend = GL11.glGetBoolean(GL11.GL_BLEND);
  4.     boolean depth = GL11.glGetBoolean(GL11.GL_DEPTH_TEST);
  5.     boolean lighting = GL11.glGetBoolean(GL11.GL_LIGHTING);
  6.     boolean[] light = new boolean[]{
  7.             GL11.glGetBoolean(GL11.GL_LIGHT0),
  8.             GL11.glGetBoolean(GL11.GL_LIGHT1),
  9.             GL11.glGetBoolean(GL11.GL_LIGHT2),
  10.             GL11.glGetBoolean(GL11.GL_LIGHT3),
  11.             GL11.glGetBoolean(GL11.GL_LIGHT4),
  12.             GL11.glGetBoolean(GL11.GL_LIGHT5),
  13.             GL11.glGetBoolean(GL11.GL_LIGHT6),
  14.             GL11.glGetBoolean(GL11.GL_LIGHT7)
  15.     };

  16.     public void apply() {
  17.         if (alpha) {GlStateManager.enableAlpha();} else {GlStateManager.disableAlpha();}
  18.         if (blend) {GlStateManager.enableBlend();} else {GlStateManager.disableBlend();}
  19.         if (depth) {GlStateManager.enableDepth();} else {GlStateManager.disableDepth();}
  20.         if (lighting) {GlStateManager.enableLighting();} else {GlStateManager.disableLighting();}
  21.         for (int i = 0; i < 8; i++)
  22.             if (light[i]) {GlStateManager.enableLight(i);} else {GlStateManager.disableLight(i);}
  23.     }

  24.     @Override public void close() {apply();}
  25. }
复制代码
lcydw66 发表于 5 天前
lcydw66 发表于 2025-1-26 19:17
你可以使用GlStateManager.pushMatrix()和GlStateManager.popMatrix()进行OpenGL状态管理,也可以手动明确 ...

仅供参考
lcydw66 发表于 5 天前
你可以使用GlStateManager.pushMatrix()和GlStateManager.popMatrix()进行OpenGL状态管理,也可以手动明确地保存和恢复光照状态。第一种代码示例
  1. @SubscribeEvent
  2. public static void onPostRenderGameOverlay(RenderGameOverlayEvent.Post event) {
  3.     if (event.getType() != RenderGameOverlayEvent.ElementType.ALL)
  4.         return;
  5.     Minecraft mc = Minecraft.getMinecraft();
  6.     ScaledResolution resolution = event.getResolution();

  7.     GlStateManager.pushMatrix(); // 保存当前状态
  8.     GlStateManager.disableLighting(); // 禁用光照

  9.     mc.getRenderItem().renderItemOverlays(
  10.             mc.fontRenderer,
  11.             mc.player.getHeldItemMainhand(),
  12.             resolution.getScaledWidth() / 2,
  13.             resolution.getScaledHeight() / 2
  14.     );

  15.     GlStateManager.popMatrix(); // 恢复之前的状态
  16. }
复制代码

第二种代码示例:
  1. @SubscribeEvent
  2. public static void onPostRenderGameOverlay(RenderGameOverlayEvent.Post event) {
  3.     if (event.getType() != RenderGameOverlayEvent.ElementType.ALL)
  4.         return;
  5.     Minecraft mc = Minecraft.getMinecraft();
  6.     ScaledResolution resolution = event.getResolution();

  7.     boolean wasLightingEnabled = GL11.glGetBoolean(GL11.GL_LIGHTING); // 获取光照状态
  8.     GlStateManager.disableLighting(); // 禁用光照

  9.     mc.getRenderItem().renderItemOverlays(
  10.             mc.fontRenderer,
  11.             mc.player.getHeldItemMainhand(),
  12.             resolution.getScaledWidth() / 2,
  13.             resolution.getScaledHeight() / 2
  14.     );

  15.     if (wasLightingEnabled) {
  16.         GlStateManager.enableLighting(); // 如果之前启用了光照,则重新启用
  17.     }
  18. }
复制代码
OpenKFC 发表于 5 天前
本帖最后由 OpenKFC 于 2025-1-26 02:51 编辑

抱歉没编辑好就发出来了……

现在编辑好了

[ MC百科(mcmod.cn) 除另有声明,所有开放公共编辑的内容均使用 BY-NC-SA 3.0 协议 ]

Minecraft百科CC协议
快速回复 返回顶部 返回列表