es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema con el código original que utiliza lessthan() y greaterthan() sin all() es que estas funciones de comparación devuelven un vector con un valor booleano para cada componente del vector de entrada. En el caso de inBox(), queremos verificar si todas las componentes de p son menores que las componentes correspondientes de hi y mayores que las componentes correspondientes de lo.

    Al envolver el resultado de lessthan() y greaterthan() en all(), estamos preguntando si todas las componentes del vector resultante son verdaderas, lo que indica que p está dentro de la caja. Sin all(), el vector tendría que verificarse manualmente para asegurarse de que todas las componentes sean verdaderas en la declaración de retorno de inBox().

    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 por lo y hi.

Comments are closed.