Если предположить, что в OpenGL 3 и выше поддерживается прямой совместимый контекст, вы можете использовать glPolygonMode
, как уже упоминалось ранее, но учтите, что линии толщиной более 1 пикселя теперь не рекомендуется использовать. Поэтому, хотя вы можете рисовать треугольники в виде каркаса, они должны быть очень тонкими. В OpenGL ES вы можете использовать GL_LINES
с тем же ограничением.
В OpenGL можно использовать геометрические шейдеры, чтобы брать входящие треугольники, разбирать их и отправлять их на растеризацию в виде квадратов (в действительности пар треугольников), эмулирующих толстые линии. Довольно просто, за исключением того, что геометрические шейдеры печально известны плохим масштабированием производительности.
Что вы можете сделать вместо этого, и что также будет работать в OpenGL ES, это использовать фрагмент шейдер. Подумайте о применении текстуры треугольника каркаса к треугольнику. За исключением того, что текстура не нужна, она может быть сгенерирована процедурно. Но хватит разговоров, давайте код. Фрагмент шейдера:
in vec3 v_barycentric; // barycentric coordinate inside the triangle
uniform float f_thickness; // thickness of the rendered lines
void main()
{
float f_closest_edge = min(v_barycentric.x,
min(v_barycentric.y, v_barycentric.z)); // see to which edge this pixel is the closest
float f_width = fwidth(f_closest_edge); // calculate derivative (divide f_thickness by this to have the line width constant in screen-space)
float f_alpha = smoothstep(f_thickness, f_thickness + f_width, f_closest_edge); // calculate alpha
gl_FragColor = vec4(vec3(.0), f_alpha);
}
И вершинный шейдер:
in vec4 v_pos; // position of the vertices
in vec3 v_bc; // barycentric coordinate inside the triangle
out vec3 v_barycentric; // barycentric coordinate inside the triangle
uniform mat4 t_mvp; // modeview-projection matrix
void main()
{
gl_Position = t_mvp * v_pos;
v_barycentric = v_bc; // just pass it on
}
Здесь барицентрические координаты - это просто (1, 0, 0)
, (0, 1, 0)
и (0, 0, 1)
для трех вершин треугольника (порядок на самом деле не имеет значения, что потенциально упрощает упаковку в треугольные полосы).
Очевидным недостатком этого подхода является то, что он съест некоторые текстурные координаты, и вам нужно изменить ваш массив вершин. Может быть решена с помощью очень простого геометрического шейдера, но я все еще подозреваю, что это будет медленнее, чем просто заполнение графического процессора большим количеством данных.