如何合并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); }
关键修复说明
- 补全代码结构:闭合所有
if语句,确保main函数完整执行到gl_Position赋值 - 分离逻辑层级:两个着色器的功能逻辑平行执行,互不嵌套,保证各自的触发条件都能独立生效
- 统一GLSL版本:使用Shader2的150版本,同时导入两个着色器需要的
fog.glsl和light.glsl - 保留原始变量:Shader2判断颜色时用原始的
Color而非修改后的vertexColor,避免逻辑干扰 - 精简变量计算:只计算一次
guiScale、guiSize等通用变量,减少冗余计算
内容的提问来源于stack exchange,提问作者Khytlu
相关产品推荐
相关产品推荐

