fix: ウォーターマークをrepeatした際にマージンが各ウォーターマークごとのマージンとなっていない問題を修正

This commit is contained in:
kakkokari-gtyih 2025-10-19 13:31:54 +09:00
parent 85a9f47168
commit 0c4b5e5c04
1 changed files with 16 additions and 6 deletions

View File

@ -110,15 +110,25 @@ void main() {
// アライメントに基づく中心で回転 // アライメントに基づく中心で回転
vec2 q = rectCenter + rot(-theta) * (p - rectCenter); vec2 q = rectCenter + rot(-theta) * (p - rectCenter);
// タイルサイズ(ウォーターマーク + マージン)で正規化してUV座標に変換 // タイルサイズ(ウォーターマーク + マージン)で正規化
vec2 tile = wmSize + margin * 2.0; vec2 tile = wmSize + margin * 2.0;
vec2 uvWm = q / tile; vec2 tileUv = q / tile;
// マージン部分を考慮してUVをオフセット・スケール // タイル内のローカル座標(0..1)を取得
uvWm = (uvWm * tile - margin) / wmSize; vec2 localUv = fract(tileUv);
// テクスチャのWRAP_REPEATにより自動的にタイル化される // ローカル座標をピクセル単位に変換
wmCol = texture(u_watermark, uvWm); vec2 localPos = localUv * tile;
// マージン領域内かチェック
bool inMargin = any(lessThan(localPos, margin)) || any(greaterThanEqual(localPos, margin + wmSize));
if (!inMargin) {
// ウォーターマーク領域内: UV座標を計算
vec2 uvWm = (localPos - margin) / wmSize;
wmCol = texture(u_watermark, uvWm);
}
// マージン領域の場合は透明(wmCol = vec4(0.0))のまま
} else { } else {
// アライメントと回転に従い一枚だけ描画 // アライメントと回転に従い一枚だけ描画
vec2 q = rectCenter + rot(-theta) * (p - rectCenter); vec2 q = rectCenter + rot(-theta) * (p - rectCenter);