Чтобы сделать это, возможность заключается в использовании фрагмента GLSL шейдер, который изменяет цвет фрагмента, когда фрагмент находится вблизи одного края треугольника. Вот шейдер GLSL, который я использую. В качестве входных данных он принимает барицентрические координаты фрагмента в треугольнике и краевую маску, которая выбирает для каждого ребра, должна ли она быть нарисована или нет. (Бэр: я должен был использовать его с профилем совместимости для обратной совместимости, если вы не хотите, чтобы сделать это, он может быть легко адаптировано):
const char* fshader_source =
"#version 150 compatibility \n"
"flat in float diffuse; \n"
"flat in float specular; \n"
"flat in vec3 edge_mask; \n"
"in vec2 bary; \n"
"uniform float mesh_width = 1.0 ; \n"
"uniform vec3 mesh_color = vec3(0.0, 0.0, 0.0) ; \n"
"uniform bool lighting = true ; \n"
"out vec4 frag_color ; \n"
"float edge_factor(){ \n"
" vec3 bary3 = vec3(bary.x, bary.y, 1.0-bary.x-bary.y) ; \n"
" vec3 d = fwidth(bary3); \n"
" vec3 a3 = smoothstep(vec3(0.0,0.0,0.0), d*mesh_width, bary3); \n"
" a3 = vec3(1.0, 1.0, 1.0) - edge_mask + edge_mask*a3; \n"
" return min(min(a3.x, a3.y), a3.z); \n"
"} \n"
"void main() { \n"
" float s = (lighting && gl_FrontFacing) ? 1.0 : -1.0 ; \n"
" vec4 Kdiff = gl_FrontFacing ? \n"
" gl_FrontMaterial.diffuse : gl_BackMaterial.diffuse ; \n"
" float sdiffuse = s * diffuse ; \n"
" vec4 result = vec4(0.1, 0.1, 0.1, 1.0); \n"
" if(sdiffuse > 0.0) { \n"
" result += sdiffuse*Kdiff + \n"
" specular*gl_FrontMaterial.specular; \n"
" } \n"
" frag_color = (mesh_width != 0.0) ? \n"
" mix(vec4(mesh_color,1.0),result,edge_factor()) : \n"
" result ; \n"
"} \n";
Может быть, пользовательский шейдер? – Shomz
Можете ли вы еще объяснить? Как можно использовать шейдерный материал для этой цели? – mrapsogos
Вы можете определить свои собственные шейдеры, чтобы вы могли попробовать: https://aerotwist.com/tutorials/an-introduction-to-shaders-part-1/ Если нет, вы всегда можете использовать текстуру каркаса с твердым задний план. – Shomz