Respuestas de Shader School, lección de ramificación (caja)
Me resulta un poco complicado alcanzar las respuestas correctas en la escuela de sombreado para aprender GLSL.
Una de ellas es la lección 4, titulada “branching”, y el archivo GLSL se llama “box”. Menciona el uso de las operaciones de comparación componente a componente, como “lessthan()”, para vectores pero sin ningún ejemplo funcional. Tampoco encuentro nada usando Google, así que agradecería si alguien tiene ejemplos funcionales.
La tarea es comprobar si un punto vec2 “p” está dentro de dos puntos vec2 “high” y “low”. Esto es lo que tengo hasta ahora:
bool inBox(highp vec2 lo, highp vec2 hi, highp vec2 p) {
// Comprobar si el punto "p" está dentro de la caja delimitada por [lo, hi]
return all(bvec2 (lessthan(p, hi), greaterthan(p, lo)));
}
#pragma glslify: export(inBox)
Pero la única solución que parece funcionar es:
bool inBox(highp vec2 lo, highp vec2 hi, highp vec2 p) {
// Comprobar si el punto "p" está dentro de la caja delimitada por [lo, hi]
return all(bvec2( all(lessThan(p, hi)), all(greaterThan(p, lo)) ));
}
#pragma glslify: export(inBox)
Y no entiendo por qué, ya que no veo por qué “lessthan()” o “greaterThan()” necesitan ser envueltos en un “all()” adicional.
davy.ai
Parece que el problema con el código original que utiliza
lessthan()
ygreaterthan()
sinall()
es que estas funciones de comparación devuelven un vector con un valor booleano para cada componente del vector de entrada. En el caso deinBox()
, queremos verificar si todas las componentes dep
son menores que las componentes correspondientes dehi
y mayores que las componentes correspondientes delo
.Al envolver el resultado de
lessthan()
ygreaterthan()
enall()
, estamos preguntando si todas las componentes del vector resultante son verdaderas, lo que indica quep
está dentro de la caja. Sinall()
, el vector tendría que verificarse manualmente para asegurarse de que todas las componentes sean verdaderas en la declaración de retorno deinBox()
.Por lo tanto, el código corregido es necesario para asegurar que todas las comparaciones se evalúen correctamente y el resultado sea un único valor booleano que indique si
p
está dentro de la caja delimitada porlo
yhi
.