vertex_submit_ext

该函数将给定顶点缓冲区中的一系列顶点提交给 GPU 进行绘制。

该范围以偏移量和要提交的顶点数的形式提供。偏移量可以是任何大于 0 的值、要提交的实际数量的顶点数或值 -1( 表示应提交从该偏移量开始的所有顶点)。

警告 使用表面作为纹理 (由 surface_get_texture 返回) 时,应确保表面本身存在 (surface_exists) 。

使用说明

 

语法:

vertex_submit_ext(buffer, primtype, texture, offset, number);

参数类型描述
bufferVertex Buffer要使用的顶点缓冲区。
primtypePrimitive Type Constant要使用的原始类型。
textureTexture要使用的纹理 (或 -1 表示无纹理)。
offsetReal顶点缓冲区中的偏移量,或者缓冲区中要提交的第一个顶点的索引。必须是 & gt; 0. 使用 -1 提交给定偏移量之后的所有顶点。
numberReal要提交的顶点数。该值被限制为顶点缓冲区的大小。

 

返回:

N/A

 

示例1:基本使用

Draw Event

 vertex_submit_ext(vb, pr_trianglelist, -1, 5, 6);

上面的代码显示了对函数 vertex_submit_ext 的基本调用。顶点数量为 6,是 3 的倍数,符合使用的 pr_trianglelist 基元类型的要求。

 

示例 2:逐步绘制一条线

Create Event

vb = vertex_create_buffer();
vertex_begin(vb, fmt_default);
repeat(100)
{
    vertex_position_3d(vb, random(room_width), random(room_height), 0);
    vertex_color(vb, c_white, 1);
    vertex_texcoord(vb, 0, 0);
}
vertex_end(vb);

Draw Event

var _num = (current_time / 1000 * 12) mod (vertex_get_number(vb) + 1);
vertex_submit_ext(vb, pr_linestrip, -1, 0, _num);

上面的代码示例用 100 个随机点填充顶点缓冲区,然后使用内置变量 current_time 的值逐步绘制更多点。

在 Create 事件中,使用 vertex_create_buffer 创建顶点缓冲区。然后,在 repeat 循环中向其中添加 100 个顶点。根据所使用的 passthrough_vertex_format,每个顶点都会在房间中获得一个随机位置、白色和未使用但必须存在的纹理坐标。

在 Draw 事件中,使用 vertex_submit_ext 作为 pr_linestrip 提交顶点缓冲区。起始顶点始终是第一个顶点 (由偏移值 0 表示),顶点数使用 current_time 和用于创建循环的简单动画的模运算符来计算。

 

示例 3:顶点组

Create Event

vb = vertex_create_buffer();
arr_groups = [];

var _px, _py, _col;
vertex_begin(vb, fmt_default);
for(var i = 0;i < 8;i++)
{
    _px = random(room_width);
    _py = random(room_height);
    _col = choose(c_red, c_blue, c_green, c_yellow);
    repeat(3)
    {
        vertex_position_3d(vb, _px + random_range(-20, 20), _py + random_range(-20, 20), 0);
        vertex_color(vb, _col, 1);
        vertex_texcoord(vb, 0, 0);
    }
    array_push(arr_groups, {visible: true, range: {offset: i * 3, num: 3}});
}
vertex_end(vb);
vertex_freeze(vb);

Draw Event

var i = 0, _num = array_length(arr_groups);
repeat(_num)
{
    var _group = arr_groups[i++];
    if (!_group.visible) { continue; }
    vertex_submit_ext(vb, pr_trianglelist, -1, _group.range.offset, _group.range.num);
}

上面的代码示例展示了如何将顶点缓冲区视为顶点组,每个顶点由顶点的范围和数量给定。每组顶点的可见性可以单独设置。

在 Create 事件中,将创建一个顶点缓冲区和一个空数组,用于存储有关每个顶点范围的信息。使用默认的 passthrough_vertex_format 总共将 8 个三角形添加到顶点缓冲区中,每个三角形在房间中的某个位置具有随机位置、随机颜色以及随机宽度和高度。还使用存储每个三角形顶点的可见性和范围的 array_pushstruct 推送到数组中。最后,使用 vertex_freeze 冻结顶点缓冲区,以便可以更快地将其提交给 GPU。

在 Draw 事件中,所有顶点组均通过在 repeat 循环内调用 vertex_submit_ext 来单独提交。如果任何组不可见,则会跳过该组并检查下一组。