你可以帮助我们扩充关于该主题的更多信息。
着色器(Shader)用于描述渲染游戏的过程。
Java版[]
着色器分为两种:核心着色器和后处理着色器。
核心着色器用于渲染游戏的不同部分。
后处理着色器用于旁观模式下的生物视角、在极佳!画质中半透明图层的混合以及实体的发光状态效果。
着色器是用OpenGL着色语言 (GLSL) 编写的。每个单独的渲染程序都分为两部分,顶点和片段。顶点着色器修改单个顶点的位置,最常用于创建波浪状的树叶和水。片段着色器应用于每个像素,可用于添加泛光、体积光和模糊等效果。
着色器存储在minecraft.jar的assets/minecraft/shaders/目录中,可用资源包替换。请注意,如果在加载着色器时发生错误,资源包将被禁用,并且极佳!画质将被关闭。
核心着色器[]
核心着色器负责渲染游戏的各个部分。它们不仅用于在游戏中渲染方块和实体,还用于渲染游戏屏幕(窗口)、选项界面等。
每个核心着色器都是由JSON文件定义的单个渲染程序,其中指定了顶点和片段着色器文件。
核心着色器存储在minecraft.jar的assets/minecraft/shaders/core目录中。
下表列出了所有核心着色器,包括其渲染内容的简短描述,以及用红色标示出其渲染范围的图像。
所需信息:以下特殊渲染的游戏元素受什么的影响:
- 黑暗晕影,以及世界边界的晕影效果
- 使用不死图腾时的动画
- 末影龙瓦解时的效果
非渲染类型[]
名称 | 用于 | 示例图像 |
---|---|---|
blit_screen | 将一个缓冲区复制到另一个缓冲区,此着色器无法用资源包覆盖。 | |
block | 没有实际作用,代码中不存在使用该着色器的代码。 | |
new_entity | 没有实际作用,代码中不存在使用该着色器的代码。 | |
particle | 所有粒子 | ![]() |
position |
|
![]() |
position_color | 纯色的色块,包括:
|
![]() |
position_color_lightmap | 没有实际作用,代码中不存在使用该着色器的代码。 | |
position_color_normal | 没有实际作用,代码中不存在使用该着色器的代码。 | |
position_color_tex |
|
![]() |
position_color_tex_lightmap | 没有实际作用,代码中不存在使用该着色器的代码。 | |
position_tex | 渲染纹理: | ![]() |
position_tex_color |
|
![]() |
position_tex_color_normal | 云 | ![]() |
position_tex_lightmap_color | 没有实际作用,代码中不存在使用该着色器的代码。 |
渲染类型[]
- 方块
名称 | 用于 | 示例图像 |
---|---|---|
rendertype_beacon_beam | 信标和末地折跃门的光柱。 | ![]() |
rendertype_crumbling | 破坏方块时的裂纹。 | ![]() |
rendertype_cutout | 部分判定箱不完整的方块及部分带透明的方块,如蜘蛛网、树苗、海带、信标、玻璃(不含染色玻璃)等。 | ![]() |
rendertype_cutout_mipped | 部分方块:草方块、铁栏杆、玻璃板、绊线钩、漏斗、锁链,以及在高品质和极佳!画质下的树叶。 | ![]() |
rendertype_end_gateway | 末地折跃门的内侧,与rendertype_end_portal 使用相同的着色器。
|
![]() |
rendertype_end_portal | 末地传送门的内部。 | ![]() |
rendertype_solid | 所有固体方块、熔岩,以及流畅画质下的树叶,同时也控制下落的不透明方块的渲染。 | ![]() |
rendertype_translucent | 半透明方块:水、冰、霜冰、下界传送门、染色玻璃、染色玻璃板与遮光玻璃、黏液块、蜂蜜块、气泡柱等。 | ![]() |
rendertype_translucent_moving_block | 被活塞移动的半透明方块。 | ![]() |
rendertype_translucent_no_crumbling | 不明,似乎并未用于任何代码。 | |
rendertype_tripwire | 绊线。(与绊线钩相连的部分被视为固体渲染[1]) | ![]() |
- 实体
名称 | 用于 | 示例图像 |
---|---|---|
rendertype_armor_cutout_no_cull | 实体身上的盔甲。 | ![]() |
rendertype_armor_entity_glint | 实体身上的盔甲附魔,透明度有内置代码影响。 | ![]() |
rendertype_energy_swirl | 闪电苦力怕旋转的电弧和凋灵半血以下的护甲。 | ![]() |
rendertype_entity_alpha | 在末影龙死亡动画时控制其身体瓦解,只影响翅膀部分。 |
|
rendertype_entity_cutout | 绝大多数具有方块形态的物品使用此着色器用于物品栏、手上和头部装备栏中的渲染,运输矿车、TNT矿车和动力矿车中的方块和浮标也使用此着色器。潜影盒、染色玻璃和染色玻璃板等不使用此着色器。 | ![]() |
rendertype_entity_cutout_no_cull | 所有实体、守卫者发出的光柱、物品栏和世界中的潜影盒、告示牌及告示牌界面。 | ![]() |
rendertype_entity_cutout_no_cull_z_offset | 在物品栏、实体装备栏和在世界中的头颅(不包括带有皮肤的玩家头颅),同时也渲染潜影贝的壳。 | ![]() |
rendertype_entity_decal | 末影龙濒死时瓦解的渲染。 | ![]() |
rendertype_entity_glint | 不明 | |
rendertype_entity_glint_direct | 不明 | |
rendertype_entity_no_outline | 渲染旗帜的颜色和形状。 | ![]() |
rendertype_entity_shadow | 渲染被实体的阴影影响了的方块,而不是渲染阴影本身,与方块网格对齐。 | ![]() |
rendertype_entity_smooth_cutout | 末地水晶光柱 | ![]() |
rendertype_entity_solid | 某些实体或类似实体的物体:旗帜、潜影贝的头、讲台/附魔台上的书、盾牌、床、钟除了边框外的部分、披风、潮涌核心周围的鹦鹉螺壳、物品栏中的潮涌核心、画、三叉戟,还有Deadmau5专属皮肤上的耳朵。玩家的在第一人称下手的下层皮肤渲染也受此影响。物品展示框本身由此着色器渲染,里面的物品却不是。物品展示框上放的地图的未绘制部分,即下层的展示框暴露在外的部分也由此着色器渲染。 | ![]() |
rendertype_entity_translucent | 半透明实体与一些实体的部分:史莱姆、玩家(影响所有的皮肤渲染,但是不影响第一人称下下层皮肤的渲染)以及带有自定义皮肤的玩家头颅、马身上的斑纹、潜影贝导弹、远古守卫者的粒子效果。 | ![]() |
rendertype_entity_translucent_cull | 只在画质不是极佳!时使用此核心着色器,用于渲染带扁平纹理的物品,同时普通玻璃与普通玻璃板在画质不是极佳!时也用此渲染。 | ![]() |
rendertype_eyes | 渲染拥有发光眼睛的实体的全身,渲染时不是完全不透明的。 | ![]() |
rendertype_item_entity_translucent_cull | 渲染不可见实体和经验球,当画质为极佳!时渲染半透明的掉落物。 | ![]() |
rendertype_leash | 实体上的拴绳,捆绑在栅栏上时也适用。 | ![]() |
rendertype_outline | 实体的发光效果。这个效果只会渲染半透明且已经出现轮廓的发光效果,而不是像先前的快照那样覆盖整个实体。 | ![]() |
rendertype_water_mask | 用于移除船内的水面,以免其看起来像是进水了一样。修改片元着色器的输出颜色没有效果,只能修改顶点着色器中输出的位置。 | ![]() |
- 杂项
包含着色器[]
包含着色器并非独立的着色器程序,而应被其他着色器文件调用。
其着色器定义了常用的辅助函数, 可使用#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(后处理)”文件储存在version.jar的assets/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前。
渲染流程[]
你可以帮助我们扩充关于该主题的更多信息。
文件格式[]
渲染程序[]
- 根标签
- blend:OpenGL混合的设置。
- func:混合时要使用的运算符。可以是
add
、subtract
、reversesubtract
、reverse_ subtract
、min
或max
。不区分大小写。默认为add
。用作glBlendEquation
的mode
参数 - srcrgb:用作
glBlendFunc
的sfactor
参数或glBlendFuncSeparate
的srcRGB
参数。可以是0
、1
、srccolor
、1-srccolor
、dstcolor
、1-dstcolor
、srcalpha
、1-srcalpha
、dstalpha
或1-dstalpha
。不区分大小写。忽略“_”。“1”、“0”、“-”可替换为“one”、“zero”、“minus”。 - dstrgb:用作
glBlendFunc
的dfactor
参数或glBlendFuncSeparate
的dstRGB
参数。可以是0
、1
、srccolor
、1-srccolor
、dstcolor
、1-dstcolor
、srcalpha
、1-srcalpha
、dstalpha
或1-dstalpha
。不区分大小写。忽略“_”。“1”、“0”、“-”可替换为“one”、“zero”、“minus”。 - srcalpha:用作
glBlendFuncSeparate
的srcalpha
参数。可以是0
、1
、srccolor
、1-srccolor
、dstcolor
、1-dstcolor
、srcalpha
、1-srcalpha
、dstalpha
或1-dstalpha
。不区分大小写。忽略“_”。“1”、“0”、“-”可替换为“one”、“zero”、“minus”。 - dstalpha:用作
glBlendFuncSeparate
的dstalpha
参数。可以是0
、1
、srccolor
、1-srccolor
、dstcolor
、1-dstcolor
、srcalpha
、1-srcalpha
、dstalpha
或1-dstalpha
。不区分大小写。忽略“_”。“1”、“0”、“-”可替换为“one”、“zero”、“minus”。
- func:混合时要使用的运算符。可以是
- cull:如果为true,则运行
glEnable(GL_CULL_FACE)
。如果为false,则运行glDisable(GL_CULL_FACE)
。默认为true。 - vertex:要使用的顶点着色器的名称(不带文件扩展名)。
- fragment:要使用的片段着色器的名称(不带文件扩展名)。
- attributes:顶点着色器要使用的属性。
- :属性。可用值是硬编码的。
- samplers:可以在着色器中使用的采样器列表。
- :采样器。
- name:采样器名称。
- file:
[需要更多信息]
- :采样器。
- 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的类型。可以是
int
、float
、matrix4x4
、matrix3x3
和matrix2x2
之一。int
也可以解释为ivec2
、ivec3
或ivec4
,具体取决于values
中实际包含的值的数量float
也可以解释为vec2
、vec3
或vec4
,具体取决于values
值中实际包含的值的数量。 - count:
values
中包含的值的数目。 - values:uniform的值,以浮点列表的形式给出。列表的长度应与
count
相同。
- name:GLSL代码中引用的uniform名称。某些名称会给与uniform特殊的行为(请注意,以下这些特殊uniform并不适用于所有着色器程序):
- :一个uniform。
- blend:OpenGL混合的设置。
渲染管线[]
以下是在游戏中使用后处理着色器的过程:首先,着色器用适当的宽度和高度初始化“targets”列表中指定的所有渲染目标。之后,着色器将依次遍历“passes”列表中指定的每个渲染过程。每个过程将在“intarget”指定的渲染目标上应用程序着色器(使用其他辅助渲染目标提供的各种额外数据),并在“outtarget”指定的渲染目标上输出最终结果。
- 根标签
- targets:渲染目标的列表。它们可以是游戏提供的缓冲区,也可以是任意名称的新缓冲区。
- :渲染目标的名称。大小默认为屏幕分辨率。
transparency
后处理着色器必须包含名为translucent
、itemEntity
、particles
、weather
、clouds
的渲染目标。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:字段应更改为的值。
- :一个uniform。
- :渲染过程。
- targets:渲染目标的列表。它们可以是游戏提供的缓冲区,也可以是任意名称的新缓冲区。
教程与文档[]
以下是制作自定义着色器的教程文档(英文):
基岩版[]
此段落仍需完善。你可以帮助我们扩充关于该主题的更多信息。
自基岩版1.18.30起,由于RenderDragon渲染引擎在所有平台实装,这些平台不再支持第三方着色器资源包。
历史[]
Java版 | |||||
---|---|---|---|---|---|
1.7.2 | 13w38a | 加入了着色器,被超级秘密选项调用。 | |||
1.8 | 14w05a | 加入了苦力怕和蜘蛛着色器。当以苦力怕、蜘蛛或末影人的视角观察世界时,着色器将自动应用于旁观模式。 | |||
14w05b | 当从生物视角时更换视角时,着色器现在从视角中移除。[2] | ||||
F4现在会切换不同的着色器,而不是关闭它们。[2] | |||||
14w06a | 加入了实体轮廓着色器。 | ||||
1.9 | 15w31a | 因内部重写而移除了超级秘密选项按钮。[3] | |||
1.16 | 20w22a | 为极佳!画质添加了透明度着色器图形模式。 | |||
1.17 | 21w10a | 加入了核心着色器。 |