Minecraft Wiki

除另有声明,转载时均必须注明出处若簡繁轉換出錯,請以遊戲內為準请勇于扩充与修正内容有兴趣逛逛我们的微博沟通交流,欢迎到社区专页需要协助,请在告示板留言

了解更多

Minecraft Wiki
注册
Advertisement
Disambig gray  本文章介绍的是游戏内的着色器。关于由模组提供的着色器,请见“ftb:Optifine”。
Dark Oak Sapling
此条目仍需完善。

你可以帮助我们扩充关于该主题的更多信息。

着色器(Shader)用于描述渲染游戏的过程。

Java版[]

着色器分为两种:核心着色器后处理着色器

核心着色器用于渲染游戏的不同部分。

后处理着色器用于旁观模式下的生物视角、在极佳!画质中半透明图层的混合以及实体的发光状态效果。

着色器是用OpenGL着色语言 (GLSL) 编写的。每个单独的渲染程序都分为两部分,顶点和片段。顶点着色器修改单个顶点的位置,最常用于创建波浪状的树叶和水。片段着色器应用于每个像素,可用于添加泛光、体积光和模糊等效果。

着色器存储在minecraft.jarassets/minecraft/shaders/目录中,可用资源包替换。请注意,如果在加载着色器时发生错误,资源包将被禁用,并且极佳!画质将被关闭。

核心着色器[]

核心着色器负责渲染游戏的各个部分。它们不仅用于在游戏中渲染方块和实体,还用于渲染游戏屏幕(窗口)、选项界面等。

每个核心着色器都是由JSON文件定义的单个渲染程序,其中指定了顶点和片段着色器文件。

核心着色器存储在minecraft.jar的assets/minecraft/shaders/core目录中。

下表列出了所有核心着色器,包括其渲染内容的简短描述,以及用红色标示出其渲染范围的图像。

包含着色器[]

包含着色器并非独立的着色器程序,而应被其他着色器文件调用。

其着色器定义了常用的辅助函数, 可使用#moj_import <文件名.glsl>#moj_import "文件名.glsl"来将GLSL文件导入着色器。注意:导入的文件应以空行结尾,否则无法加载。

此种着色器储存在minecraft.jar的assets/minecraft/shaders/include目录中。

名称 描述
fog 包含了可根据顶点距离计算颜色的linear_fog函数。
light 包含了minecraft_mix_light函数。
matrix 包含了返回绕z轴的二维向量的旋转矩阵的mat2_rotate_z函数。
projection 包含了projection_from_position函数。

后处理着色器[]

目前,后处理着色器用于旁观模式下的生物视角、在极佳!画质中半透明图层的混合以及实体的发光状态效果。

后处理着色器使用“post(后处理)”文件来定义由一系列“程序”组成的管线

每个“程序”由一个包含着单独的渲染程序的JSON文件定义。

“post(后处理)”文件储存在client.jarassets/minecraft/shaders/post目录中,而程序储存在assets/minecraft/shaders/program中。

目前游戏中仅实装了5个后处理着色器:

  • creeper.json: 旁观模式的苦力怕视角。
  • invert.json: 旁观模式的末影人视角。
  • spider.json: 旁观模式的蜘蛛视角。
  • entity_outline.json: 当屏幕上有发光实体时使用。
  • transparency.json: “极佳!”画质时使用。

在这两个目录中,还有许多未使用的着色器,它们在1.9之前用于“超级秘密选项”(15w31a)。请参见着色器/Java版1.9前

渲染流程[]

Dark Oak Sapling
此条目仍需完善。

你可以帮助我们扩充关于该主题的更多信息。

文件格式[]

渲染程序[]

  • 根标签
    •   blend:OpenGL混合的设置。
      •   func:混合时要使用的运算符。可以是addsubtractreversesubtractreverse_ subtractminmax。不区分大小写。默认为add。用作glBlendEquationmode参数
      •   srcrgb:用作glBlendFuncsfactor参数或glBlendFuncSeparatesrcRGB参数。可以是01srccolor1-srccolordstcolor1-dstcolorsrcalpha1-srcalphadstalpha1-dstalpha。不区分大小写。忽略“_”。“1”、“0”、“-”可替换为“one”、“zero”、“minus”。
      •   dstrgb:用作glBlendFuncdfactor参数或glBlendFuncSeparatedstRGB参数。可以是01srccolor1-srccolordstcolor1-dstcolorsrcalpha1-srcalphadstalpha1-dstalpha。不区分大小写。忽略“_”。“1”、“0”、“-”可替换为“one”、“zero”、“minus”。
      •   srcalpha:用作glBlendFuncSeparatesrcalpha参数。可以是01srccolor1-srccolordstcolor1-dstcolorsrcalpha1-srcalphadstalpha1-dstalpha。不区分大小写。忽略“_”。“1”、“0”、“-”可替换为“one”、“zero”、“minus”。
      •   dstalpha:用作glBlendFuncSeparatedstalpha参数。可以是01srccolor1-srccolordstcolor1-dstcolorsrcalpha1-srcalphadstalpha1-dstalpha。不区分大小写。忽略“_”。“1”、“0”、“-”可替换为“one”、“zero”、“minus”。
    •   cull:如果为true,则运行glEnable(GL_CULL_FACE)。如果为false,则运行glDisable(GL_CULL_FACE)。默认为true。
    •   vertex:要使用的顶点着色器的名称(不带文件扩展名)。
    •   fragment:要使用的片段着色器的名称(不带文件扩展名)。
    •   attributes:顶点着色器要使用的属性。
      • :属性。可用值是硬编码的。
    •   samplers:可以在着色器中使用的采样器列表。
    •   uniforms:可以在着色器中使用的uniform列表。
      • :一个uniform。
        •   name:GLSL代码中引用的uniform名称。某些名称会给与uniform特殊的行为(请注意,以下这些特殊uniform并不适用于所有着色器程序):
          • (float) Time:0到1之间的值,表示时间,每秒重置一次(以秒为单位),仅在后处理着色器有效。
          • (vec2) InSize:输入缓冲区的宽度和高度(以像素为单位),仅在后处理着色器有效。
          • (vec2) OutSize:输出缓冲区的宽度和高度(以像素为单位),仅在后处理着色器有效。
          • (vec2) AuxSize<i>: 辅助缓冲区的宽度和高度(以像素为单位),<i>应该替换为渲染过程中辅助目标的次序,仅在后处理着色器有效。
          • (matrix4x4) ModelViewMat:模型视图矩阵,仅在核心着色器有效。
          • (matrix4x4) ProjMat:投影矩阵
          • (matrix4x4) TextureMat:用于变换物品UV来显示物品闪烁效果,仅在核心着色器有效。
          • (vec2) ScreenSize:当前帧缓冲区的宽度和高度
          • (vec4) ColorModulator:游戏内部代码设置的一个颜色乘法器,仅在核心着色器有效。
          • (vec3) Light0_Direction:用以渲染实体光照的第一个三维向量,仅在核心着色器有效。
          • (vec3) Light1_Direction:用以渲染实体光照的第二个三维向量,参见Light0_Direction,仅在核心着色器有效。
          • (float) FogStart:雾开始处到摄影机的距离,仅在核心着色器有效。
          • (float) FogEnd:雾结束处到摄影机的距离,仅在核心着色器有效。
          • (vec4) FogColor:雾的颜色,仅在核心着色器有效。
          • (float) LineWidth:线宽,用于渲染线框的线条,如方块选择框和调试命中框,仅在核心着色器有效。
          • (float) GameTime:世界的全局时间(以游戏日为单位),仅在核心着色器有效。
          • (vec3) ChunkOffset:渲染区块范围时,从摄影机世界位置到区块范围基点的偏移量,仅在核心着色器有效。
        •   type:uniform的类型。可以是intfloatmatrix4x4matrix3x3matrix2x2之一。int也可以解释为ivec2ivec3ivec4,具体取决于values中实际包含的值的数量float也可以解释为vec2vec3vec4,具体取决于values值中实际包含的值的数量。
        •   countvalues中包含的值的数目。
        •   values:uniform的值,以浮点列表的形式给出。列表的长度应与count相同。

渲染管线[]

以下是在游戏中使用后处理着色器的过程:首先,着色器用适当的宽度和高度初始化“targets”列表中指定的所有渲染目标。之后,着色器将依次遍历“passes”列表中指定的每个渲染过程。每个过程将在“intarget”指定的渲染目标上应用程序着色器(使用其他辅助渲染目标提供的各种额外数据),并在“outtarget”指定的渲染目标上输出最终结果。

  • 根标签
    •   targets:渲染目标的列表。它们可以是游戏提供的缓冲区,也可以是任意名称的新缓冲区。
      • :渲染目标的名称。大小默认为屏幕分辨率。transparency后处理着色器必须包含名为translucentitemEntityparticlesweatherclouds的渲染目标。entity_outline后处理着色器必须包含名为final的渲染目标。
      • :要添加的渲染目标。
        •   name:要添加的渲染目标的名称。
        •   width:渲染目标的宽度。
        •   height:渲染目标的高度。
    •   passes:过程的列表。
      • :渲染过程。
        •   name:应用于输入并发布到输出的程序着色器的名称。使用“blit”将数据从intarget复制到outtarget。
        •   intarget:要用作输入的渲染目标的名称。可使用minecraft:main指定为游戏屏幕。
        •   outtarget:要输出到的渲染目标的名称。它不应与intarget相同。可使用minecraft:main指定为游戏屏幕。
        •   auxtargets:辅助目标的列表。
          • 辅助目标。
            •   name:传递到程序JSON中的辅助目标的名称。
            •   id:辅助目标的id。指向targets中定义的缓冲区名称,或指向assets/<namespace>/textures/effect下的纹理位置(使用命名空间ID引用)。在缓冲区名称后添加:depth可访问其深度缓冲。例如,要访问minecraft:main的深度缓冲,应填minecraft:main:depth
            •   width:如果id引用纹理,则为必需。以像素为单位描述纹理的宽度。
            •   height:如果id引用纹理,则为必需。以像素为单位描述纹理的高度。
            •  bilinear:如果id引用纹理,则为必需。确定用于图像的缩放算法是双线性还是最近邻。
        •   uniforms:要重写的字段的列表,用于更改程序JSON中uniforms列表中的值。
          • :一个uniform。
            •   name:应更改的字段的名称。
            •   values:字段应更改为的值。

渲染透明方块[]

渲染透明方块是指所有使用了透明或半透明渲染着色器的方块。这些方块的模型中允许有透明的纹理,在渲染时这些透明的片段会被抛弃或与后方混合。渲染透明方块不一定是不完整的方块,因为绝大多数方块模型内并不包含透明的片段。例如上半台阶,它的模型是1×0.5×1的长方体,其中并不包含透明部分,在渲染时使用固体着色器,所以它并不是一个渲染透明方块。

使用透明着色器的方块会丢弃模型中所有透明度小于一定值的片段,产生完全透明的效果。这些着色器包括:

使用半透明着色器的方块会与其后方的颜色进行混合,以达到半透明的效果。在渲染时这些方块会被排序渲染。这些着色器包括:

不属于上列所述的所有方块都使用rendertype_solid着色器,即固体渲染着色器。使用固体渲染着色器的方块就是渲染不透明方块,或固体渲染方块。这些方块的模型中所有透明片段都不能被自动丢弃或者与后方混合,所有透明部分在渲染时会变为不透明的白色。固体渲染方块的透明片段不能简单地通过修改纹理使它变得渲染透明,只能通过修改着色器来使这些透明部分正常丢弃,达到透明效果。

在固体渲染方块中,还有更加特殊的完全固体渲染方块,它们的遮挡形状完整并可以遮挡光线。如果方块的一个渲染面被完全固体渲染方块的表面遮挡时,无论这个渲染面的形状如何,这个渲染面都不会被渲染。

教程与文档[]

以下是制作自定义着色器的教程文档(英文):

基岩版[]

此段落仍需完善。你可以帮助我们扩充关于该主题的更多信息。

基岩版1.18.30起,由于RenderDragon渲染引擎在所有平台实装,这些平台不再支持第三方着色器资源包。

历史[]

Java版
1.7.213w38a加入了着色器,被超级秘密选项调用。
1.814w05a加入了苦力怕和蜘蛛着色器。当以苦力怕蜘蛛末影人的视角观察世界时,着色器将自动应用于旁观模式
14w05b当从生物视角时更换视角时,着色器现在从视角中移除。[2]
F4现在会切换不同的着色器,而不是关闭它们。[2]
14w06a加入了实体轮廓着色器。
1.915w31a因内部重写而移除了超级秘密选项按钮。[3]
1.1620w22a极佳!画质添加了透明度着色器图形模式。
1.1721w10a加入了核心着色器。
21w16a加入了rendertype_text_intensityrendertype_text_intensity_see_through核心着色器。
1.1922w12a加入了rendertype_entity_translucent_emissive核心着色器。
1.19.423w06a加入了rendertype_text_backgroundrendertype_text_background_see_through核心着色器。
1.2023w18a移除了blocknew_entity核心着色器。
加入了rendertype_gui、​rendertype_gui_overlay、​rendertype_gui_text_highlightrendertype_gui_ghost_recipe_overlay核心着色器。

参考[]

语言

Advertisement