以下は、指定されたテクスチャ座標がボックス内にある場合にテクセルを出力する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;
}
以下は分岐のないバージョンですが、それでも不器用です。「テクスチャ座標クランプ」のベストプラクティスは何ですか?
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));
}
ラベルが付いている領域にテクセルをクランプしています-この場合、テクスチャのs&t座標は0から1の間になります。それ以外の場合は、ラベルがない場所に茶色を使用します。
必要のないときにテクスチャルックアップを実行しない分岐バージョンのコードを作成することもできることに注意してください。これは、常にテクスチャルックアップを実行する非分岐バージョンよりも高速ですか?多分いくつかのテストの時間...