你可以帮助我们扩充关于该主题的更多信息。
着色器(Shader)用于描述渲染游戏的过程。
Java版[]
着色器分为两种:核心着色器和后处理着色器。
核心着色器用于渲染游戏的不同部分。
后处理着色器用于旁观模式下的生物视角、在极佳!画质中半透明图层的混合以及实体的发光状态效果。
着色器是用OpenGL着色语言 (GLSL) 编写的。每个单独的渲染程序都分为两部分,顶点和片段。顶点着色器修改单个顶点的位置,最常用于创建波浪状的树叶和水。片段着色器应用于每个像素,可用于添加泛光、体积光和模糊等效果。
着色器存储在minecraft.jar的assets/minecraft/shaders/目录中,可用资源包替换。请注意,如果在加载着色器时发生错误,资源包将被禁用,并且极佳!画质将被关闭。
核心着色器[]
核心着色器负责渲染游戏的各个部分。它们不仅用于在游戏中渲染方块和实体,还用于渲染游戏屏幕(窗口)、选项界面等。
每个核心着色器都是由JSON文件定义的单个渲染程序,其中指定了顶点和片段着色器文件。
核心着色器存储在minecraft.jar的assets/minecraft/shaders/core目录中。
下表列出了所有核心着色器,包括其渲染内容的简短描述,以及用红色标示出其渲染范围的图像。
非渲染类型[]
名称 | 用途 | 示例图像 |
---|---|---|
blit_screen | 将一个缓冲区复制到另一个缓冲区,此着色器无法用资源包覆盖。 | |
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_gateway 使用相同的着色器
|
|
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_armor_glint | 没有实际作用 | |
rendertype_energy_swirl | 闪电苦力怕旋转的电弧和凋灵半血以下的护甲,透明度由内置代码影响 | |
rendertype_entity_alpha | 在末影龙死亡动画时控制其身体瓦解,只影响翅膀部分 | |
rendertype_entity_cutout | 所有非渲染半透明方块的物品,矿车或方块展示实体渲染的非渲染半透明方块,箱子,箭和浮漂 | |
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_entity_translucent_emissive | 监守者发光渲染层 | |
rendertype_eyes | 渲染拥有发光眼睛的生物(末影龙、末影人、幻翼和蜘蛛)的全身,透明度由内置代码影响 | |
rendertype_item_entity_translucent_cull | 渲染不可见实体和经验球,当画质为极佳!时渲染在非玩家物品栏和手上的各种玻璃和染色玻璃板物品 | |
rendertype_leash | 生物上的拴绳,不包括拴绳结部分 | |
rendertype_lightning | 控制闪电和末影龙死亡动画的紫色光晕。 | |
rendertype_outline | 渲染物体的轮廓,包括实体的发光效果 | |
rendertype_water_mask | 用于移除船内的水面,以免其看起来像是进水了一样;修改片段着色器的输出颜色没有效果,只能修改顶点着色器中输出的位置 |
- 文本
名称 | 用途 | 示例图像 |
---|---|---|
rendertype_text | 地图,使用非灰度图的位图字体、unihex 字体和丢失的字体的文本(不包括 see_through为true的文本展示实体内的文本和未潜行时的实体名牌)
|
|
rendertype_text_background | see_through为false的文本展示实体的背景 | |
rendertype_text_background_see_through | see_through为true的文本展示实体的背景 | |
rendertype_text_intensity | 使用灰度图的位图字体或矢量字体的文本(不包括 see_through为true的文本展示实体内的文本和未潜行时的实体名牌) | |
rendertype_text_intensity_see_through | see_through为true的文本展示实体和未潜行时实体名牌内使用灰度图的位图字体或矢量字体的文本 | |
rendertype_text_see_through | see_through为true的文本展示实体和未潜行时实体名牌内使用非灰度图的位图字体、unihex 字体和丢失的字体的文本
|
- 杂项
包含着色器[]
包含着色器并非独立的着色器程序,而应被其他着色器文件调用。
其着色器定义了常用的辅助函数, 可使用#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.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×0.5×1的长方体,其中并不包含透明部分,在渲染时使用固体着色器,所以它并不是一个渲染透明方块。
使用透明着色器的方块会丢弃模型中所有透明度小于一定值的片段,产生完全透明的效果。这些着色器包括:
rendertype_tripwire
:绊线着色器,自动丢弃所有透明度小于0.1的片段。只适用于绊线。rendertype_cutout_mipped
:使用多级渐远纹理的透明着色器,自动丢弃所有透明度小于0.5的片段。下列方块使用这个着色器:rendertype_cutout
:普通透明着色器,自动丢弃所有透明度小于0.1的片段。下列为使用这个着色器的方块:- 花
- 蘑菇
- 草、高草丛、蕨和大型蕨
- 小麦、甜菜根、胡萝卜、马铃薯、下界疣、可可果、仙人掌和甘蔗
- 海带、海草和高海草
- 缠怨藤、垂泪藤、下界苗、菌类和菌索
- 南瓜茎、结果的南瓜茎、西瓜茎和结果的西瓜茎
- 大型垂滴叶、小型垂滴叶和大型垂滴叶茎
- 杜鹃花丛和盛开的杜鹃花丛
- 甜浆果
- 枯萎的灌木
- 紫颂植株
- 紫颂花
- 树苗
- 竹子
- 藤蔓
- 洞穴藤蔓
- 发光地衣
- 睡莲
- 覆地苔藓
- 孢子花
- 粉红色花簇
- 垂根
- 珊瑚、珊瑚扇
- 海泡菜
- 蜘蛛网
- 玻璃
- 床
- 红石线
- 红石中继器和红石比较器
- 门
- 梯子
- 活板门
- 铁轨、激活铁轨、动力铁轨和探测铁轨
- 火把、灵魂火把和红石火把
- 火和灵魂火
- 灯笼和灵魂灯笼
- 营火和灵魂营火
- 刷怪笼
- 酿造台
- 信标
- 潮涌核心
- 末地烛
- 花盆
- 脚手架
- 切石机
- 避雷针
- 海龟蛋
- 滴水石锥
- 紫晶芽和紫水晶簇
- 幽匿感测体、幽匿尖啸体和幽匿脉络
- 青蛙卵
使用半透明着色器的方块会与其后方的颜色进行混合,以达到半透明的效果。在渲染时这些方块会被排序渲染。这些着色器包括:
rendertype_translucent
:用于普通方块的半透明着色。包括:rendertype_translucent_moving_block
:只用于移动中的半透明方块,即移动的活塞。
不属于上列所述的所有方块都使用rendertype_solid
着色器,即固体渲染着色器。使用固体渲染着色器的方块就是渲染不透明方块,或固体渲染方块。这些方块的模型中所有透明片段都不能被自动丢弃或者与后方混合,所有透明部分在渲染时会变为不透明的白色。固体渲染方块的透明片段不能简单地通过修改纹理使它变得渲染透明,只能通过修改着色器来使这些透明部分正常丢弃,达到透明效果。
在固体渲染方块中,还有更加特殊的完全固体渲染方块,它们的遮挡形状完整并可以遮挡光线。如果方块的一个渲染面被完全固体渲染方块的表面遮挡时,无论这个渲染面的形状如何,这个渲染面都不会被渲染。
教程与文档[]
以下是制作自定义着色器的教程文档(英文):
基岩版[]
此段落仍需完善。你可以帮助我们扩充关于该主题的更多信息。
自基岩版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 | 加入了核心着色器。 | |||
21w16a | 加入了rendertype_text_intensity 和rendertype_text_intensity_see_through 核心着色器。 | ||||
1.19 | 22w12a | 加入了rendertype_entity_translucent_emissive 核心着色器。 | |||
1.19.4 | 23w06a | 加入了rendertype_text_background 和rendertype_text_background_see_through 核心着色器。 | |||
1.20 | 23w18a | 移除了block 和new_entity 核心着色器。
| |||
加入了rendertype_gui 、rendertype_gui_overlay 、rendertype_gui_text_highlight 和rendertype_gui_ghost_recipe_overlay 核心着色器。 |
参考[]
- ↑ MC-214692 — 漏洞状态为“不予修复”。
- ↑ 2.0 2.1 MC-46727(评论#219617)
- ↑ https://twitter.com/_grum/status/627141591942209536
语言