Desenhando uma borda em um polígono 2d com um sombreamento de fragmento
Eu tenho alguns polígonos simples (menos de 20 vértices) tornando-os planos em um simples plano xy, usando GL_TRIANGLES e uma cor plana, uma simulação 2D.
Eu gostaria de adicionar uma borda de espessura variável e uma cor diferente para esses polígonos. Eu tenho algo implementado usando os mesmos vértices e glLineWidth / GL_LINE_LOOP, que funciona, mas é outra passagem de renderização e repete todas as transformações de vértices.
Eu acho que eu deveria ser capaz de fazer isso no shader de fragmento usando gl_FragCoord e os dados de vértices e / ou coordenadas de textura, mas não tenho certeza, e minhas tentativas ingênuas foram obviamente incorretas.
Eu imagino algo como o seguinte.
uniform vec2 scale; // viewport h/w
uniform float line_width;
uniform vec4 fill_color;
uniform vec4 border_color;
varying vec4 vertex; // in world coords
void main()
{
if (distance_from_edge(gl_FragCoord, vertex, scale) < line_width)
{
// we're close to the edge the polygon, so we're the border.
gl_FragColor = border_color;
}
else
{
gl_FragColor = fill_color;
}
}
A parte que estou tentando descobrir é a função distance_from_edge - como isso pode ser calculado? Está usando gl_FragCoord a abordagem errada - eu deveria estar usando algum tipo de mapeamento de textura?
Como experiência, tentei converter o vértice em espaço de pixel com a escala e depois calcular a distância entre ele e gl_FragCoord em pixels, mas isso deu resultados estranhos que eu realmente não entendi. Além disso, preciso da distância até oBeira, não o vértice, mas não sei como conseguir isso.
Alguma ideia?
EDIT: com base na resposta de Nicol, minha pergunta se torna:
Assumindo que eu tenha um triângulo com 3 vértices de canto marcados como vértices de aresta e um vértice no meio marcado como não aresta (então renderizado com 3 triângulos no total), então como interpolar no sombreador de fragmento para desenhar uma borda de um dado espessura? Eu estou supondo que eu passar o sinalizador de borda para o sombreador de fragmento, bem como a espessura de linha desejada, e faz algum cálculo de interpolação para descobrir a distância entre a borda e não vértices de borda e limiares a cor como borda / preencher conforme apropriado ?