You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并Minecraft资源包的两个GLSL着色器?求助修复代码

Minecraft GLSL着色器合并修复方案

问题分析

你尝试合并的代码存在几个致命问题:

  • 代码未完成:最后一个if语句没有闭合,缺少},也没执行Shader2里的位置偏移和颜色修改逻辑,直接中断了程序流程
  • 逻辑嵌套错误:把Shader2的等级数字处理逻辑放到了Shader1的GUI文本检测if内部,导致等级数字的修改只会在满足Shader1条件时才触发,完全不符合原需求
  • 冗余计算:重复计算了guiScale、guiSize等变量,虽然不报错但浪费性能

修复后的合并着色器代码

基于Shader2的GLSL 150版本(兼容更高特性,同时兼容Shader1的功能),整合两个着色器的完整功能:

#version 150

#moj_import <fog.glsl>
#moj_import <light.glsl>

in vec3 Position;
in vec4 Color;
in vec2 UV0;
in ivec2 UV2;

uniform sampler2D Sampler0;
uniform sampler2D Sampler2;

uniform mat4 ModelViewMat;
uniform mat4 ProjMat;
uniform mat3 IViewRotMat;
uniform int FogShape;
uniform vec2 ScreenSize;

out float vertexDistance;
out vec4 vertexColor;
out vec2 texCoord0;

#define ACTIONBAR_OFFSET 64

// Shader1:垂直偏移转ID函数
float get_id(float offset) {
    if (offset <= 0)
        return 0;
    return trunc(offset/1000);
}

// Shader2:顶点位置检测函数
bool isAt(int offset, int vID, int pos) {
    return (((vID == 1 || vID == 2) && offset == pos) || ((vID == 0 || vID == 3) && offset == (pos+8)));
}

void main() {
    vec3 pos = Position;

    // 初始化通用输出变量
    vertexDistance = fog_distance(ModelViewMat, IViewRotMat * Position, FogShape);
    vertexColor = Color;
    texCoord0 = UV0;

    vec2 pixel = vec2(ProjMat[0][0], ProjMat[1][1]) / 2.0;
    int guiScale = int(round(pixel.x / (1 / ScreenSize.x)));
    vec2 guiSize = ScreenSize / guiScale;

    // --- 执行Shader1的排版优化逻辑 ---
    float id = get_id((round(guiSize.y - Position.y + ACTIONBAR_OFFSET)) * -1);
    
    if (id > 99 && Color.a != 0.0) {
        float yOffset = 0;
        float xOffset = 0;
        int layer = 0;
        bool outlined = false;

        switch (int(id)) {
        %POSITIONS%
        }

        if (%OUTLINE_CONDITION%) {
            pos.y -= (id*1000) + 500 - ACTIONBAR_OFFSET;
            pos.x -= (guiSize.x * 0.5);
            pos -= vec3(xOffset, yOffset, 0.0);
            pos.z += layer;
        }
    }

    // --- 执行Shader2的等级数字移动与重着色逻辑 ---
    int vID = gl_VertexID % 4;
    int offset = int(round(guiSize.y - Position.y));
    
    if(Position.z == 0.0 
        && ((length(Color.rgb - vec3(0.501, 1.0, 0.125)) < 0.002 && (isAt(offset, vID, 26) || isAt(offset, vID, 27)))
        || (length(Color.rgb - vec3(0.0, 0.0, 0.0)) < 0.002 && (isAt(offset, vID, 25) || isAt(offset, vID, 26) || isAt(offset, vID, 27) || isAt(offset, vID, 28))))) {
        
        // 移动等级数字位置
        pos += vec3(0.0,10.0,0.0);
        
        // 重着色等级数字
        if(length(Color.rgb - vec3(0.0, 0.0, 0.0)) < 0.002) {
            vertexColor = vec4(0.4431, 0.3294, 0, 1); // 阴影颜色
        } else {
            vertexColor = vec4(0.8784, 0.6627, 0, 1); // 文本颜色
        }
    }

    // 最终设置顶点位置
    gl_Position = ProjMat * ModelViewMat * vec4(pos, 1.0);
}

关键修复说明

  1. 补全代码结构:闭合所有if语句,确保main函数完整执行到gl_Position赋值
  2. 分离逻辑层级:两个着色器的功能逻辑平行执行,互不嵌套,保证各自的触发条件都能独立生效
  3. 统一GLSL版本:使用Shader2的150版本,同时导入两个着色器需要的fog.glsl和light.glsl
  4. 保留原始变量:Shader2判断颜色时用原始的Color而非修改后的vertexColor,避免逻辑干扰
  5. 精简变量计算:只计算一次guiScale、guiSize等通用变量,减少冗余计算

内容的提问来源于stack exchange,提问作者Khytlu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 12:42:31