基元和顶点格式

图元是一种使用点来定义屏幕上显示内容的绘图类型。它们可以由单个点、线或三角形组成,可以着色、进行 Alpha 混合,甚至可以赋予纹理,这意味着它们可以用来在 2D 和 3D 游戏中创建一些非常令人兴奋的效果!

图元的点称为 顶点 ( 单个 顶点 ),并存储有关其位置、颜色、纹理和可能的其他信息的数据。然后,GPU 使用您提供的原始 类型 绘制这些顶点:

The different primitive types

例如,您可以使用两个三角形基元创建一个矩形,然后使用标志精灵对其进行纹理化,并在实例的绘制事件中让该标志在风中 " 波动",并通过简单地修改形成的点来扭曲您使用的精灵原语。

警告 除非您在 游戏选项 中启用了 WebGL,否则这些函数无法与 HTML5 模块配合使用。

创建基元

GameMaker 提供两种绘制和创建基元的方法:

基元函数

draw_primitive_* 函数允许您定义基元并将其直接绘制到屏幕 (或 表面 )。您调用 draw_primitive_begindraw_primitive_begin_texture,然后使用任意 draw_vertex_* 函数定义顶点,最后调用 draw_primitive_end 以绘制图元。

Draw Event

var _tex = sprite_get_texture(spr_image, 0);
draw_primitive_begin_texture(pr_trianglestrip, _tex);
draw_vertex_texture(0, 0, 0, 0);
draw_vertex_texture(100, 0, 1, 0);
draw_vertex_texture(0, 100, 0, 1);
draw_vertex_texture(100, 100, 1, 1);
draw_primitive_end();

顶点缓冲区

顶点缓冲区是定义可重用图元的更高级方法。它们是专门存储有关顶点的数据 (" 顶点数据 ") 的 缓冲区 。使用顶点缓冲区,您可以将图元的定义及其绘制分开。

您可以使用 vertex_create_buffer/vertex_create_buffer_ext 创建一个新的空顶点缓冲区,或者使用 vertex_create_buffer_from_buffer 创建一个缓冲区并用缓冲区中的数据填充它 /vertex_create_buffer_from_buffer_ext

Create Event

// Create an empty vertex buffer
vb = vertex_create_buffer();

// Create a vertex buffer filled with data from a buffer
var _buff = buffer_load("model.mod");
vb_model = vertex_create_buffer_from_buffer(_buff, format);
buffer_delete(_buff);

注意 有关如何在两种缓冲区类型之间传递数据的详细信息,请参阅 在缓冲区之间传输数据

您可以使用 vertex_submit 在 Draw 事件中随时提交顶点缓冲区,或者使用 vertex_submit_ext 提交其中的一部分来绘制顶点缓冲区。

以下是使用 GameMaker 的默认 直通顶点格式 的完整示例:

Create Event

var _uv_data = sprite_get_uvs(spr_image, 0);
var _umin = _uv_data[0], _vmin = _uv_data[1], _umax = _uv_data[2], _vmax = _uv_data[3];

vb = vertex_create_buffer();

vertex_begin(vb, format);

vertex_position_3d(vb,   0,   0, 0); vertex_color(vb, c_white, 1); vertex_texcoord(vb, _umin, _vmin);
vertex_position_3d(vb, 100,   0, 0); vertex_color(vb, c_white, 1); vertex_texcoord(vb, _umax, _vmin);
vertex_position_3d(vb,   0, 100, 0); vertex_color(vb, c_white, 1); vertex_texcoord(vb, _umin, _vmax);
vertex_position_3d(vb, 100, 100, 0); vertex_color(vb, c_white, 1); vertex_texcoord(vb, _umax, _vmax);

vertex_end(vb);

Draw Event

var _tex = sprite_get_texture(spr_image, 0);
vertex_submit(vb, pr_trianglestrip, _tex);

Cleanup Event

vertex_delete_buffer(vb);

注意 有关如何使用顶点缓冲区的详细信息,请参阅 基元和顶点构建指南

纹理坐标

在上面的代码示例中,为顶点缓冲区提供了不同的 UV。这是因为两组函数对 UV 的解释不同:

注意 您可以使用函数 sprite_get_uvsfont_get_uvstileset_get_uvs 获取特定资源的 UV 范围在纹理页面上。

功能参考

基元

顶点格式

GameMaker 允许您定义自己的顶点格式,您可以从中创建自己的自定义基元。这可以大大加快着色器操作的速度,或者可以用来扩展其功能并创建令人惊讶的效果。

顶点格式 按顺序列出为顶点存储的属性。您首先使用 vertex_format_begin 定义一个属性,然后使用 vertex_format_add_* 函数添加属性,最后使用 vertex_format_end 结束。

顶点缓冲区

创建顶点格式后 (请参阅上面的部分),您可以使用它来构建您想要使用以下顶点缓冲区函数绘制的图元:

重要信息 您构建的基元应遵循您使用 " 顶点格式 " 函数设置的格式,因此,如果您定义了仅包含位置数据的顶点格式,则没有必要使用颜色构建基元数据。您应该注意,向正在构建的图元添加属性的顺序是由创建顶点格式时添加这些属性的顺序定义的,因此,如果您已使用顺序位置、颜色和纹理定义了矢量格式坐标,您 必须 将这些属性添加到以相同顺序构建的基元中,否则您会收到错误。

有关如何使用顶点函数构建基元的概述,请参阅: