0

ベーステクスチャ(128 * 128)に「マーク」(64 * 64)を配置する単純なシェーダーを作成しようとしています。マークが必要な場所を示すために、ベースにシアン色のマークサイズ(64 * 64)領域を使用しますテクスチャ。
ベース画像
マーク画像
になる
望ましい結果

フラグメントシェーダー

precision lowp float;

uniform sampler2D us_base_tex;
uniform sampler2D us_mark_tex;

varying vec2 vv_base_tex;
varying vec2 vv_mark_tex;

const vec4 c_mark_col = vec4(0.0, 1.0, 1.0, 1.0);//CYAN

void main()
{
 vec4 base_col = texture2D(us_base_tex, vv_base_tex);

if(base_col == c_mark_col)
{
 vec4 mark_col = texture2D(us_mark_tex, vv_mark_tex);//texelFetch magic overhere must be
 base_col = mix(base_col, mark_col, mark_col.a);
}
 gl_FragColor = base_col;
}

もちろん、それはうまく機能しません。私はこのようなものを得ました(デモンストレーションのみの透明度、シアン領域はなく、「T」の部分のみ):
問題

私はそれを理解しようとしていますが、texelFetchのようなものだけが助けになりますが、ベーステクスチャシアンテクセルのtex座標を取得し、それを取得するように変換する方法がわかりません-最初の列/最初の行のシアンベーステクセル=最初の列/最初行マーク テクセル、2 列目/1 行目のベース = 2 列目/マークの 1 行目。等

4

1 に答える 1

2

これを 1 回のパスで行う方法はあると思いますが、以下に示す情報を保持できる別のテクスチャを使用する必要があります。したがって、テクスチャ メモリの使用量を増やすことになります。

このアプローチでは、2 番目のテクスチャ (元のテクスチャをオフラインまたは何らかの方法で後処理することで生成できます) に、デカールの UV マップが含まれています。

  1. R = シアンの正方形の左からの正規化された距離
  2. G = シアンの正方形の頂点からの正規化された距離
  3. B = 気にしない

これで、ピクセル シェーダーは単純になりました。現在のテクセルがシアンかどうかを確認し、「decal-uvmap」テクスチャから R と G を選択し、それらをテクスチャ座標として使用してデカール テクスチャをサンプリングするだけです。

このテクスチャのビット深度 (およびそのサイズ) は、元のテクスチャのサイズに関連しているため、元のテクスチャよりもはるかに小さい「decal-uvmap」テクスチャを使用できる可能性があることに注意してください。

于 2012-08-10T19:59:27.487 に答える