0

GLPaint サンプル コードのようにペイントできるアプリを作成したいと考えていますが、拡大してペイント内の詳細をペイントすることもできます。しかし、GLPaint アプリで使用されている OpenGL ES 1.0 を使用することは、習得するのがかなり難しく、私のニーズに対して少しやり過ぎかもしれないと感じています。setFrame メソッドを使用してメイン ビュー フレームをジェスチャ認識機能でズームするように変更すると、フレーム サイズが変更されるたびに、既にペイントされている線が消去されます。

だから私は別のアイデアでそれを実現しようとしました: touchmoves メソッドでは、ブラシの画像を含む「多くの」位置に uiimageviews を追加します。これは glpaint アプリよりも遅く、メモリ管理の混乱が少しありますが、私はしません。そこに行く別の方法が見つかりません。

提案があれば、openGL ES 1.0 または 2.0 を学ぶか、最後のアイデアを実現しようとしています

4

2 に答える 2

0

あなたは確かにあなたがしていることを達成することができますが、それにはいくらかの努力が必要です.

ほとんどの OpenGL シーンは通常、GLPaint サンプル コードのように累積バッファに依存しないため、通常、ズームは非常に簡単です。

GLPaint でビューをズームしようとすると、新しい絵は元の絵の上に調整された縮尺で描かれます。

回避策は、表示中のスクリーン バッファに直接描画する代わりに、最初にテクスチャ バッファにレンダリングし、次にクワッド (または同等のもの) でそのテクスチャ バッファをレンダリングします。こうすることで、ペイント バッファが蓄積バッファを保持している間に、クワッド シーンをクリアして、フレームが更新されるたびに (任意のスケールで) 再レンダリングできます。

これはテスト済みで動作します。

于 2015-06-07T17:56:19.297 に答える
-1

数分間描画した後、画像表示方法はやり過ぎになると確信しています... openGLを使用すると、すべてのズームを非常にうまく行うことができます。最善の方法は、ズームインしても解像度が失われないように、できるだけ大きなキャンバスを作成することです。

ズームについて: GL フレームやその他のフレームのサイズを変更しようとしないでください。たとえ成功したとしても、解像度が失われます。標準のマトリックスを使用して、シーンを変換およびスケーリングするか、単に遊んでglOrthoください (その値を現在表示されている四角形に設定します)。その部分を取得したら、悲しいことに、少し数学を必要とする 2 つのことを行う必要があります。1 つ目は、ビュー内の位置がズームと変換について認識しないため、openGL シーンの新しいタッチ位置を計算する必要があります。2 つ目は、おそらくブラシもスケーリングする必要があります(シーンが大きい場合は小さくして、詳細を描画できるようにします).

キャンバスについて: メインのレンダリング バッファではなく FBO に描画し、テクスチャをメインのレンダリング シーンに提示することをお勧めします。ここで、FBO にはテクスチャが添付され、サイズが 2 の累乗になることに注意してください (新しいデバイスの場合は 2048x2048 または 4096x4096 を作成します)。ただし、おそらくその一部を使用して、画面と同じ比率を維持するだけです (glViewport仕事をする必要があります)。 ) したがって、テクスチャ座標を計算する必要があります。全体的に、描画メカニズムはあまり変わりません。

要約すると、タッチ イベントで特定のサイズと位置のブラシを適用するキャンバス (FBO) があり、そのキャンバスをテクスチャとして使用し、メインの GL ビューに描画するとします。

于 2013-05-24T07:30:00.313 に答える