着色器

着色器是一个非常强大的工具,用于操纵图形卡向屏幕呈现内容和方式。由于这些小程序实际上运行在显卡上,这意味着它们处理速度极快,为更多的游戏逻辑释放了宝贵的CPU周期。

要创建着色器,需要使用着色器编辑器编写顶点着色器碎片着色器(也称为像素着色器),并且即使(例如)仅希望更改正在绘制的实例的顶点位置,或者如果只想更改像素的颜色值,仍需要两个程序才能使完整着色器工作。

注意 着色器不允许您更改传递给它们的任何变量的值,因此在所有引用它们的文档中,这些变量将称为着色器常量

有关 GameMaker 当前使用的 GLSL ES 语言规范的完整概述,包括可用于对着色器本身进行编程的函数和变量,请参阅 GLSL ES Specification 1.00.。如果您正在寻找这些函数和变量的快速概述,以下链接非常有用,因为它包含最后两张卡上的 OpenGL ES API 的一些快速参考卡:OpenGL ES 参考卡

在项目中使用着色器非常简单,只需几行代码即可从中获得最基本的用途:

shader_set(myShader);
draw_self();
shader_reset();

正如您所看到的,它们以类似的方式用于混合模式和表面,其中您首先选择(设置)着色器,使用它绘制您想要的,然后之后再次重置绘制目标。如果您希望通过着色器而不是单个精灵或背景来渲染整个屏幕,则需要设置一个表面来捕捉当前视图,然后将其传递到着色器(有关详细信息,请参阅Surfaces)。

注意 着色器,就像任何与绘制相关的东西一样,只能在绘制事件中使用。同样值得注意的是,如果您尝试在着色器中使用颜色值,并且对象没有纹理,结果将变为黑色。

如果使用的着色器具有输入值,则使用统一函数设置这些值。首先使用着色器在实例的创建事件中使用函数shader_get_uniform()获取统一句柄(本质上是要设置 uniform 的ID值),然后将这些句柄存储在变量中,如下所示:

colour_to_find = shader_get_uniform(sShaderDemo5, "f_Colour1");
colour_to_set = shader_get_uniform(sShaderDemo5, "f_Colour2");

有了统一的句柄后,可以在绘制事件的着色器代码中设置它们,如下所示:

shader_set(sShaderDemo5);
shader_set_uniform_f(colour_to_find, 1,1,1 );
shader_set_uniform_f(colour_to_set, 1,0,0 );
draw_sprite(sprite_index,image_index,x+24, y);
shader_reset();

最后要注意的一点是,尽管着色器在所有平台上都被接受,但它们仍然是特定于设备的,如果设备的硬件或软件不能使用着色器,则会出现错误。因此,建议您在设置统一或使用着色器本身之前检查着色器是否已编译,如下所示:

if (shader_is_compiled(myShader))
{
    shader_set(myShader);
    draw_self();
    shader_reset();
}
else show_debug_message("Shader failed");

作为额外检查,您还可以调用函数shaders_are_supported()来查看硬件是否甚至支持着色器。通常,您会在游戏开始时执行这些检查,并将结果存储为全局变量,然后进行检查。

需要注意的是,GameMaker还支持一些条件编译,这些宏可以在GLSL ES着色器中使用,因此它们可以在特定的支持平台上执行替代代码。下表显示了宏及其生成的平台:

 

Shader Macro目标平台
_YY_GLSLES_1所有目标平台
_YY_GLSL_2Mac和Ubuntu(Linux)
_YY_HLSL11_3Windows, XboxOne
_YY_PSSL_4PS4

 

当您使用GLSL ES格式着色器在任何一个列出的平台上编译GameMaker项目时,将生成上述宏之一,然后可以在着色器代码中使用这些宏,如下所示:

#ifdef _YY_HLSL11_
// HLSL shader code here
#else
// GLSL shader code here
#endif

如果您是着色器的新手,或者想要使用GameMaker创建和使用着色器的更完整指南,请参阅手册的以下页面:

 

以下函数可用于绘制与设置着色器:

 

我们还有一个特殊的函数,它定义了所有着色器的全局状态:

 

在着色器中使用纹理采样器时,您将需要有关正在使用的纹理的信息,在这种情况下,您可以使用以下函数:

 

虽然本手册不会介绍任何 OpenGL 着色器函数和变量,但它确实包含了 GameMaker 所独有的函数和变量的列表。这些常量不是着色器的 OpenGL 规范的一部分,提供这些常量是为了简化项目中着色器的集成。

 

最后,GameMaker允许您定义自己的顶点格式,从中可以创建自己的自定义基元。这可以大大加快着色器操作,或用于扩展其函数并创建出人意料的效果。您可以在以下章节中找到这方面的信息: