Рисование полигонов в 3D

Проблема рисования прошлым путём состоит в том, что спрайт или полигон всегда (ложь) находиться в плоскости xy, то есть, все углы имеют одинаковую глубину. Для 3D, Вы захотите иметь грани в других глубинах (истина). С этого момента мы поговорим о z-координате, а не о глубине. Итак, мы хотим определить координаты (x,y,z) кортежей. Для этого имеется специальная версия продвинутых функций рисования:

d3d_primitive_begin(kind) Начинает с 3D примитива указанного типа: pr_pointlist, pr_linelist, pr_linestrip,pr_trianglelist,pr_trianglestrip или pr_trianglefan.
d3d_vertex(x,y,z) Добавляет вершину (x,y,z) в примитив, используя величину цвета и альфа прозрачности установленных прежде.
d3d_vertex_color(x,y,z,col,alpha) Добавляет вершину (x,y,z) в примитив, со своей собственной цветовой и альфа значением. Это позволит Вам создать примитивы с гладко изменяющимися цветовыми и альфа значениями.
d3d_primitive_end() Заканчивает описание примитива. Эта функция в действительности его рисует.

Например, чтобы нарисовать четырёхгранник (трёхстороннюю пирамиду) располагаясь на z=0 плоскости с вершиной в z = 200, Вы можете использовать следующие коды:

{
  d3d_primitive_begin(pr_trianglelist);
    d3d_vertex(100,100,0);
    d3d_vertex(100,200,0);    
    d3d_vertex(150,150,200);
    d3d_vertex(100,200,0);
    d3d_vertex(200,200,0);    
    d3d_vertex(150,150,200);
    d3d_vertex(200,200,0);
    d3d_vertex(100,100,0);    
    d3d_vertex(150,150,200);
    d3d_vertex(100,100,0);
    d3d_vertex(100,200,0);    
    d3d_vertex(200,200,0);
  d3d_primitive_end();
}

Теперь, используя это, наиболее вероятно, Вы должны просто видеть треугольник на экране, поскольку верхушка четырёхгранника будет находиться за ним с точки зрения вида. Также, используя просто один цвет, будет трудно увидеть другие лицевые стороны. Ниже мы увидим, как пути изменяли точку зрения вида. "Назначитель" цветов может быть создан перед дополнительной функцией draw_set_color(col), вызванной между гранями.

Вы можете также использовать текстурные полигоны в 3D. Это работает точно так же, как и в главе по функциям рисования. Но на этот раз, Вам нужны варианты основных 3D функций. Единственная вещь, которую Вы должны реализовать. В текстуре позиция (0,0) является левым верхним углом. Но часто, при проектировании (как указано ниже) используется левый нижний угол (0,0). В таком случае, Вам, вероятно, нужно перебросить текстуру по вертикали.

d3d_primitive_begin_texture(kind,texid) Начинает с 3D примитива указанного типа kind с указанной текстурой texid.
d3d_vertex_texture(x,y,z,xtex,ytex) Добавляет вершину (x,y,z) в примитив с позицией (xtex,ytex) в текстуре, смешивающейся с цветовым и альфа значением, установленных прежде.
d3d_vertex_texture_color(x,y,z,xtex,ytex,col,alpha) Добавляет вершину (x,y,z) в примитив с позицией (xtex,ytex) в текстуре, смешивающейся со своим собственной цветовым и альфа значением.
d3d_primitive_end() Заканчивает описание примитива. Эта функция в действительности его рисует.

Так, например, Вы можете использовать следующие коды, чтобы нарисовать изображение фона, которое исчезает на расстоянии

{
  var ttt;
  ttt = background_get_texture(back);
  d3d_primitive_begin_texture(pr_trianglefan,ttt);
    d3d_vertex_texture(0,480,0,0,0);
    d3d_vertex_texture(640,480,0,1,0);    
    d3d_vertex_texture(640,480,1000,1,1);
    d3d_vertex_texture(0,480,1000,0,1);


  d3d_primitive_end();
}

Треугольник имеет переднюю и заднюю сторону. Передняя сторона определяется для того, чтобы являться стороной, в которой грани определяются против часовой стрелки. Обычно нарисованы обе стороны. Но если Вы делаете закрытую форму, то это зря - поскольку задняя часть треугольника не может быть видима. В этом случае, Вы можете включить отбор задней лицевой стороны. Это сохраняется в "полусумме" времени рисования, но это также предоставит задачу для определения собственных многоугольников в правильном пути. Существуют следующая функция:

d3d_set_culling(cull) Указывает, запустить ли отбор задней лицевой стороны (истина) или остановить отбор задней лицевой стороны (ложь).