opengl-es - tamaño - mostrar grosor de linea autocad 2018
¿Es posible dibujar grosor de línea en un sombreador de fragmentos? (3)
Aquí está mi enfoque. Sean p1 y p2 los dos puntos que definen la línea y sean el punto cuya distancia a la línea que desea medir. El punto es muy probable que sea gl_FragCoord.xy / resolution;
Aquí está la función.
float distanceToLine(vec2 p1, vec2 p2, vec2 point) {
float a = p1.y-p2.y;
float b = p2.x-p1.x;
return abs(a*point.x+b*point.y+p1.x*p2.y-p2.x*p1.y) / sqrt(a*a+b*b);
}
Luego úsalo en tus funciones de mezcla y paso suave.
También revisa esta respuesta: https://stackoverflow.com/a/9246451/911207
¿Es posible que yo agregue grosor de línea en el sombreador de fragmentos considerando que trazo la línea con GL_LINES? La mayoría de los ejemplos que vi parecen acceder solo a los texeles dentro de la primitiva en el sombreado de fragmentos y un sombreador de grosor de línea tendría que escribir en texels fuera de la primitiva de línea para obtener el grosor. Si es posible, sin embargo, un ejemplo muy pequeño, básico, sería genial.
Bastante es posible con los sombreadores de fragmentos. Solo mira lo que algunos chicos están haciendo . Estoy muy lejos de ese nivel, pero este código puede darte una idea:
#define resolution vec2(500.0, 500.0)
#define Thickness 0.003
float drawLine(vec2 p1, vec2 p2) {
vec2 uv = gl_FragCoord.xy / resolution.xy;
float a = abs(distance(p1, uv));
float b = abs(distance(p2, uv));
float c = abs(distance(p1, p2));
if ( a >= c || b >= c ) return 0.0;
float p = (a + b + c) * 0.5;
// median to (p1, p2) vector
float h = 2 / c * sqrt( p * ( p - a) * ( p - b) * ( p - c));
return mix(1.0, 0.0, smoothstep(0.5 * Thickness, 1.5 * Thickness, h));
}
void main()
{
gl_FragColor = vec4(
max(
max(
drawLine(vec2(0.1, 0.1), vec2(0.1, 0.9)),
drawLine(vec2(0.1, 0.9), vec2(0.7, 0.5))),
drawLine(vec2(0.1, 0.1), vec2(0.7, 0.5))));
}
Otra alternativa es verificar con texture2D
el color del píxel cercano, de esa manera puede hacer que la imagen brille o se vea más texture2D
(por ejemplo, si alguno de los píxeles de ajuste es blanco), haga que el píxel actual sea blanco, si el próximo píxel cercano es blanco, haga que sea actual pixel gris).
No, no es posible en el fragmento shader. Sin embargo, puede usar un sombreador de geometría para expandir su línea a un cuadrante (o, en realidad, dos triángulos) que pueden representar una línea gruesa.
Here''s una buena discusión sobre ese tema (con ejemplos de código).