Di seguito è riportato uno shader di frammenti GLSL che emette un texel se il coord della texture è all'interno di una finestra, altrimenti viene emesso un colore . Questo sembra semplicemente stupido e il lì deve essere un modo per farlo senza diramazioni?GLSL point box test interno
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;
}
Di seguito è una versione senza diramazione, ma si sente ancora maldestro. Qual è la migliore pratica per "texture coord clamping"?
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));
}
sto bloccaggio texel alla regione con l'etichetta è - la struttura s & t coordinate saranno tra 0 e 1, in questo caso. In caso contrario, io uso un colore marrone dove l'etichetta non è.
Nota che potrei anche creare una versione di ramificazione del codice che non esegua una ricerca di trama quando non è necessario. Sarebbe più veloce di una versione non ramificata che ha sempre eseguito una ricerca della trama? Forse il tempo per alcuni test ...
Sono sempre interessato a vedere i risultati del benchmarking per cose come questa. Penso che in questo caso potrebbe essere necessario costruire uno scenario in cui molti test point-in-box diventano un collo di bottiglia. – jozxyqk