blog

IOS Metal: フィルタリングを行う際に、隣接するピクセルの座標を取ることについてのメモ。

画像をスクリーンに配置するには、少し回転させる必要がありました。 ビューポートは、スクリーン座標とメタルの間の2つの座標空間を接続するために使用されます。メタルではすべての座標が座標であり、2Dの場合...

Apr 13, 2020 · 2 min. read
シェア

本記事では、以下の内容を取り上げます:

  • カメライメージをスクリーン空間にマッピングする方法
  • フィルター作成時の隣接ピクセルの取り方

<1> スクリーンスペースへのカメラキャプチャ

そのため、イメージを少し回転させてフレームに入れる必要がありました。

スクリーン座標とMetalの間の2つの座標空間を接続するには、ビューポートを設定します。Metalではすべての座標が正規化された座標なので、2Dの場合だけ、左下が[-1, -1]、右上が[1, 1]、原点が真ん中になります。スクリーン座標は原点が左上にあり、正の方向は右と下になります。

ビューポートは、画面のどの領域がMetalの座標空間に対応するかをシステムに伝えます。ドキュメントによると、viewportはpointではなくpixelを使用するので、スクリーンのスケールを乗算するように注意してください。

<1.1> テクスチャ座標

カメラでキャプチャされたフレームを取得した後、それをメタルシステム内でテクスチャに変換する必要があります。テクスチャの特定の位置を記述するには、テクスチャ座標系を使用します。

<1.2> 頂点座標とテクスチャ座標の対応関係

テクスチャは、金属に4つの頂点を提供する必要があります。明らかに、この4つの頂点は、座標空間にある4つの頂点であり、長方形のテクスチャを表示するために三角形を形成するためには、Z字形になる必要があります。

テクスチャを対応する頂点に正しく貼り付けるためには、1つずつ対応させることも必要ですが、この対応付けは意図したとおりに行うことができます。

しかし、フロントカメラの場合は、マッピングする左右の方向を少しイメージ化する必要があり、また、必要に応じてマッピングの終点を変更するだけです。

<2> フィルタリング中の隣接ピクセル

ガウシアンフィルタリングや平均値フィルタリングなどのフィルタリングを行う場合、近傍の画素点を取得する必要があります。 メタルの座標はすべて浮動小数点数なので、近傍の画素点の座標を知るにはどうしたらいいのでしょうか?その時、私は自分の考え方に盲点があり、他の人に盲点から抜け出すように頼みました。

考えてみてください、座標の右1ピクセルの座標を知りたければ、現在の解像度をもう一度考えればいいのです。解像度が100 * 100だとして、それが点だとしたら?51÷100じゃないの?

ですから、この質問は実にシンプルです。

int width = 1080;
int height = 1920;
float newX = (textureCoordinate.x * width + 1) / width;
float newY = (textureCoordinate.y * height + 1) / height;

だから、順番を入れ替えることで問題を解決することができました。

Read next

インパクトマッピング:ビジネスアジャイルでマスターすべき可視化の力

プロジェクトや要件がR&Dに渡されるとき、通常、ビジネスが最も気にするのはスケジュールとコストです。R&Dはこれらの要件に基づいて製品を提供しますが、これは実際には契約関係です。契約関係の利点は、権限と責任の分担が明確であることですが、最大の問題は、R&Dが苦労して生み出した製品が、本当に事業価値を生み出し、会社に収益をもたらすのか、ということです。 R&Dは業績と直接的に強い関係があるわけではありません。私は、研究開発...

Apr 13, 2020 · 3 min read