Прежде всего, я не знаю, что вызывает это, но я думаю, что это файлы модели.
Как я решил это, вместо предварительной обработки координат Bary centri c, я бы вычислил их или, скорее, назначил бы их в геометрическом шейдере, например, так:
vBC = vec3(1, 0, 0);
gl_Position = gl_in[0].gl_Position;
EmitVertex();
vBC = vec3(0, 1, 0);
gl_Position = gl_in[1].gl_Position;
EmitVertex();
vBC = vec3(0, 0, 1);
gl_Position = gl_in[2].gl_Position;
EmitVertex();
и ничего больше, просто передайте их фрагментному шейдеру, и он сделает все остальное:
#version 400
precision mediump float;
layout (location = 0) out vec4 outColor;
in vec3 vBC;
const float lineWidth = 0.5;
const vec3 lineColor = vec3(0.7, 0.7, 0.7);
float edgeFactor() {
vec3 d = fwidth(vBC);
vec3 f = step(d * lineWidth, vBC);
return min(min(f.x, f.y), f.z);
}
void main(){
outColor = vec4(255, 191, 0.0, (1.0-edgeFactor())*0.95);
}
Вершинный шейдер только ничего не определяет в позициях иначе самое основное c.
Вот шейдер с полной геометрией, если он кому-нибудь нужен:
#version 400
layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;
out vec3 vBC;
void main()
{
vBC = vec3(1, 0, 0);
gl_Position = gl_in[0].gl_Position;
EmitVertex();
vBC = vec3(0, 1, 0);
gl_Position = gl_in[1].gl_Position;
EmitVertex();
vBC = vec3(0, 0, 1);
gl_Position = gl_in[2].gl_Position;
EmitVertex();
}
Вот несколько картинок: Как Вы можете увидеть его работу с прозрачностью, которая выполняется с помощью:
Вот статьи, на которые я смотрел: https://tchayen.github.io/wireframes-with-barycentric-coordinates/ http://codeflow.org/entries/2012/aug/02/easy-wireframe-display-with-barycentric-coordinates/
И классная книга, которая мне очень помогла: https://people.inf.elte.hu/plisaai/pdf/David%20Wolff%20-%20OpenGL%204.0%20Shading%20Language%20Cookbook%20 (2) .pdf
На всякий случай вот шейдер Vertex:
#version 400
precision mediump int;
precision mediump float;
layout (location = 0) in vec3 position;
uniform mat4 T_MVP;
void main() {
gl_Position = T_MVP * vec4(position, 1.0);
}