A continuación se muestra un sombreador de fragmento GLSL que genera un mensaje de texto si la coordinada de textura dada está dentro de un cuadro; de lo contrario, se genera un color . Esto simplemente se siente tonto y el debe ser una forma de hacer esto sin ramificar?Prueba de cuadro dentro del cuadro GLSL
uniform sampler2D texUnit;
varying vec4 color;
varying vec2 texCoord;
void main() {
vec4 texel = texture2D(texUnit, texCoord);
if (any(lessThan(texCoord, vec2(0.0, 0.0))) ||
any(greaterThan(texCoord, vec2(1.0, 1.0))))
gl_FragColor = color;
else
gl_FragColor = texel;
}
A continuación, se muestra una versión sin ramificar, pero todavía se siente torpe. ¿Cuál es la mejor práctica para "sujetar coordenadas de textura"?
uniform sampler2D texUnit;
varying vec4 color;
varying vec4 labelColor;
varying vec2 texCoord;
void main() {
vec4 texel = texture2D(texUnit, texCoord);
bool outside = any(lessThan(texCoord, vec2(0.0, 0.0))) ||
any(greaterThan(texCoord, vec2(1.0, 1.0)));
gl_FragColor = mix(texel*labelColor, color,
vec4(outside,outside,outside,outside));
}
Estoy sujeción texels a la región con la etiqueta es - la textura s & t coordenadas será de entre 0 y 1 en este caso. De lo contrario, uso un color marrón donde la etiqueta no es.
Tenga en cuenta que también podría construir una versión de bifurcación del código que no realizar una búsqueda de textura cuando no es necesario. ¿Sería esto más rápido que una versión no ramificada que siempre realizó una búsqueda de textura? Tal vez para algunas pruebas ...
Siempre me interesan los resultados de la evaluación comparativa para cosas como esta. Creo que en este caso es posible que tengas que construir un escenario en el que muchas pruebas point-in-box se conviertan en un cuello de botella. – jozxyqk