問題タブ [texturing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
performance - OpenGL テキスト ラベル付けの技術と速度の期待
私はopengl(固定機能パイプライン)を使用しており、潜在的に数十万のポイントを描画し、それぞれにテキストラベルを付けています。この質問は、私が合理的な方法でこれを行っているかどうか、および速度に関して何が期待できるかについてのものです。
テキスト ラベルは、文字ごとにテクスチャ座標の四角形を作成し、小さなフォント ビットマップを使用して四角形をテクスチャリングすることによって描画されます (各文字は、テクスチャ内で約 5x13 ピクセルです)。
テスト ファイルには、経度と緯度で指定された約 158,000 のポイントがあるため、この経度/緯度空間が「モデル空間」です。それらのポイントを読み取り、それらのopengl頂点バッファーを作成します。次に、各ポイントは、通常 3 文字または 4 文字の長さのラベルを取得します。つまり、平均で 3.5 文字としましょう。ポイントはスクリーン座標で描画されます (オルソ投影モード)。キャラクターごとに、テクスチャ座標の rect を作成してキャラクターの適切なピクセルを取得し、スクリーン座標でキャラクターが描画される四角形を作成します。これら 2 つの四角形のセットは、それぞれ頂点バッファーに入れられます。つまり、158k * 3.5 * 8 = 440 万ポイント、つまり、描画四角形の 880 万の個別の座標番号と、テクスチャ座標の 880 万の番号です。
レンダリングするときが来たら、すべてのモデル ポイントの現在の画面位置と一致するように、すべての描画四角形の画面座標を更新する必要があります (少なくともこれが唯一の方法だと思います)。つまり、158 個のモデル ポイントのそれぞれについて、ポイントのモデル (ワールド) 座標から投影された (スクリーン) 座標を計算し、ポイントの 3 つまたは 4 つの文字四角形のそれぞれに 4 つのコーナー座標を設定する必要があります。 . したがって、基本的には、レンダリングごとに 880 万の数字をすべて更新しています。これらの数値を更新するには、レンダリングごとに約 0.3 秒かかります。
質問番号 1: これは、opengl でポイントのラベル付けを処理する正しい/必要な方法のように聞こえますか? 「このモデル ポイントにリンクされているが、投影されたモデル ポイントからのスクリーン オフセットとして扱われる、この長方形ポイントのセットに自動的にレンダリングする」と言う方法があれば理想的です。そうすれば、レンダリングごとに描画四角形を更新する必要がなくなります。でもそんなことないですよね?
質問 2: 各レンダリングの前にこれらすべての画面四角形を更新する時間に加えて、158k のすべてのラベルが画面に表示されると、レンダリング自体に約 1 秒かかります (これは明らかに有用なユーザー エクスペリエンスではありませんが、私はここで速度を理解しようとしているだけです)。ズームインすると、実際に画面に描画されるポイント/ラベルが少なくなり、レンダリング時間はそれに比例して短くなります。平均的/最新の GPU を搭載した私の平均的/最新のラップトップで、1 秒が 158k * 3.5 = 553k のテクスチャ付きクワッドをレンダリングするのに妥当な時間のように聞こえるかどうかを理解しようとしています。「何百万もの三角形」が障害ではないと人々が話していることは知っていますが、私が見ている速度が合理的/予想されるテクスチャリングについて疑問に思っています。
助けてくれてありがとう。
以下のコードを追加しました。position_labels
私が取り除きたいのは、各レンダーの呼び出しであることに注意してください。
opengl - 同じシェーダーの GLSL textureCube と texture2D
1 つのシェーダーでtexture2D()
との両方を使用できないようです。textureCube()
私が行うと、何も表示されず、エラーもありません。独自のシェーダー ローダーと Apple GLSL シェーダー ビルダーの両方でこれを試しましたが、同じことが起こりました。textureCube()
頂点シェーダーとフラグメントにある場合でも発生texture2D()
します。単独では問題ないように見えますが、呼び出されるとすぐに、どの順序でも何も表示されません。
c++ - OpenGL でのテクスチャ マッピングの問題
OpenGL でのテクスチャのマッピングに問題があります。これは、現在これらのテクスチャで正しくロードしようとしているモデルへのリンクです。
ここに、すべての関連ファイルがあるディレクトリへのリンクがあります: http://karvis.kapsi.fi/
問題は、img1.jpg
赤でマークした領域は、3D 倉庫モデルからわかるように、テクスチャでマッピングする必要はありません。問題は、テクスチャのない領域もあるはずなのに、何らかの理由でモデル全体がマップされることです。テクスチャのない同じモデルもあります。img2.jpg
そして、私がコンパイルしているコードがあります: main.cpp
. Collada モデルのインポートには Asset Import Library を使用し、画像を RGB 形式に変換するには FreeImage を使用しています。
なぜこれが起こっているのか誰にも分かりますか?間違ったパラメータを OpenGL に渡しているのかもしれません。それとも、これらのテクスチャなどをロードする方法に問題があるのでしょうか?
opengl - OpenGL マップ アプリケーションのラベル
短縮版
ユーザーがズームインおよびズームアウトするときに座標を手動で再計算することなく、OpenGL マッピング アプリケーションで短いテキスト ラベルを描画するにはどうすればよいですか?
ロングバージョン
最大約 25 万ポイントのデータ セットを描画できるようにする必要がある OpenGL ベースのマッピング アプリケーションがあります。各ポイントには、通常 4 ~ 5 文字の短いテキスト ラベルを付けることができます。
現在、すべての文字を含む単一のテキストを使用してこれを行っています。ポイントごとに、ラベル内の各文字のクワッドを定義します。したがって、「Fred」というラベルの付いたポイントには 4 つのクワッドが関連付けられ、各クワッドはテクスチャ座標を使用してその単一のテクスチャに対応するキャラクターを描画します。
マップを描画するときは、マップ ポイント自体をマップ座標 (経度/緯度など) で描画します。次に、画面座標で各点の位置を計算し、その点のラベルの各クワッドの 4 つのコーナー ポイントを、再び画面座標で更新します。(たとえば、ポイントがスクリーン ポイント 100, 150 に描画されていると判断した場合、ポイントのラベルの最初の文字のクワッドを、左上のポイント 105, 155 で始まり、幅が特定の文字に適した 6 ピクセル、高さ 12 ピクセル. 次に、2 番目の文字は 120、155 などで始まります.) 次に、これらすべてのラベル文字クワッドが正しく配置されたら、直交スクリーンを使用してそれらを描画します.投影。
問題は、これらすべての文字クワッド座標を更新するプロセスが遅く、150k ポイントの特定のテスト データ セットで約 0.5 秒かかることです (つまり、各ラベルの長さは約 4 文字であるため、約 150k * [ 1 ポイントあたり 4 文字] * [1 文字あたり 4 座標ペア] アップデートごとに設定する必要がある座標ペア。
マップ アプリケーションにズームが含まれていなければ、更新のたびにこれらすべての座標を再計算する必要はありません。ラベルの座標を一度計算してから、表示用の四角形をシフトして正しい領域を表示するだけです。しかし、ズームでは、座標計算を行わないと機能させる方法がわかりません。そうしないと、ズームインすると文字が大きくなり、ズームアウトすると文字が小さくなります。
私が望んでいるのは (そして、OpenGL が提供していないと私が理解していること) は、固定された画面座標の四角形に四角形を描画する必要があることを OpenGL に伝える方法ですが、その四角形の左上の位置は、マップ座標空間内の特定のポイント。したがって、プリミティブ階層 (特定のマップ ポイントは、そのラベル キャラクター クワッドの親) と、この階層内で 2 つの異なる座標系を混在させる機能の両方が必要です。
私が設定できる魔法の変換マトリックスがあるかどうかを理解しようとしていますが、それを行う方法がわかりません。
私が検討したもう 1 つの方法は、各ポイントでシェーダーを使用して、そのポイントのラベル文字クワッド座標の計算を処理することです。私はこれまでシェーダーを扱ったことがなく、(a) シェーダーを使用してこれを行うことが可能かどうか、および (b) シェーダー コードでこれらすべてのポイントを計算することで、自分で計算するよりも実際に何かが得られるかどうかを理解しようとしています。 . (ちなみに、大きなボトルネックは、更新された座標を GPU にアップロードすることではなく、クワッド座標を計算することであることを確認しました。後者は少し時間がかかりますが、それは計算であり、更新される座標の数です。その 0.5 秒の大部分を占めます。)
(もちろん、別の方法としては、最初に特定のビューでどのラベルを描画する必要があるかをより賢くすることです。しかし、ここでは、すべてのラベルを描画する必要があると仮定して、解決策に集中したいと思います。)
opengl - OpenGL - 同じオブジェクトの異なる表面の異なるテクスチャ
OpenGL を使用して作成しているゲームの車を描画しようとしています。car オブジェクトは、付随する .mtl ファイルとともに .obj ファイルに格納されます。
車には 500 以上の頂点と 100 以上の面があり、独自の頂点シェーダーとフラグメント シェーダーを使用して、50 以上の異なるテクスチャを適用する必要があります。オブジェクトに関するすべての情報を一度に送信するバッファ オブジェクトを使用して、これを実現しました。私の問題は、同じオブジェクトの異なる表面に異なるテクスチャを適用しようとすることです。
この問題に対して私が見つけた答えは、テクスチャを特定のテクスチャ番号 (GL_TEXTURE0、GL_TEXTURE1 など) にバインドし、それを参照するフラグメント シェーダに Sampler2D を渡すことです。しかし、この方法で 50 を超えるテクスチャを保存できますか? 私が知る限り、それは GL_TEXTURE32 です。
また、車のオブジェクトの特定の面にのみテクスチャを適用するようにシェーダーに指示するにはどうすればよいでしょうか?
opengl - OpenGL-テクスチャアトラスの「スマッジング」
同じサイズの2つの画像を並べてステッチして作成したテクスチャアトラスを使用しています。テクスチャ座標を変更するときは、次の順序で実行します。
if(texCoordx>1) texCoordx = texCoordx % 1
-したがって、あるテクスチャが別のテクスチャに漏れることはありません。if(texCoordx<0) texCoordx = 1 + texCoordx
-繰り返しますが、あるテクスチャが別のテクスチャに漏れることはありません。- テクスチャ座標を0.5でスケーリングします。
- 右側にテクスチャを描画する場合は、0.5を追加します。
これはほとんど問題なく機能しますが、テクスチャの座標が1と0に近づくエッジで「汚れ」が発生するようです。t軸に沿って汚れているように見えます。スクリーンショットを添付しました。
ここで答えが1つ見つかったのは知っていますが、それは汚れをわずかに狭めるだけです。独自のシェーダーを使用していますが、テクスチャ座標の変更は行っていません。私も有効にしてGL_REPEAT
います。誰かが考えられる原因/解決策を知っていますか?
opengl - OpenGL - テクスチャリング、不要な傾斜と回転
車のオブジェクトのさまざまなクワッドにいくつかのテクスチャ アトラスをマップしようとしています。クワッドに直接マッピングするのではなく、一部のテクスチャが歪んだり回転したりするという問題に遭遇しています。問題を以下に示します。何が起こっているかをより明確に示すために、スマイリー フェイスを使用しました。
テクスチャ アトラスの幅を 2 の累乗にしようとしましたが、うまくいきません。また、友人から、これはテクスチャ アトラスが均一な幅ではないことが原因であると聞きましたが、すべてのケースで問題が解決したわけではありません。幅を変更すると問題が解決する場合があるという事実は、テクスチャの幅が原因である可能性があると私に信じさせます。
関連する場合は、独自のシェーダーを使用して、テクスチャ アトラスのテクスチャ座標操作を実行しています。この問題の原因についての手がかりはありますか?
qt - Qt QImage を glsl テクスチャ サンプラーに渡す
Qt を使用してレンダリング エンジンを作成していますが、モデルのテクスチャリングで問題が発生しています
テクスチャリングをテストするための非常に単純なシェーダーがあります: 頂点シェーダー:
およびフラグメント シェーダー:
テクスチャ座標をシェーダーに正しく渡しています。問題は、QImage をバインドし、それをテクスチャ ユニフォームに送信することです。
次のコードを使用してテクスチャをバインドしています。
シェーダーが機能し、ユニフォームをマトリックスに渡し、属性を頂点とテクスチャ座標に渡すことができますが、ユニフォームを同じ方法でテクスチャに送信しようとすると、次のようになります。
glGetError() が「無効な列挙型」を返し、「アクセス違反読み取り場所」エラーでプログラムがクラッシュする</p>
興味深いことに、テクスチャをサンプラーに送信せずにプログラムを実行しようとすると、テクスチャが実際にモデルに表示されます。これは、バインディングの方法が従来のテクスチャ処理と関係があり、テクスチャがシェーダーによって取得されている特定のテクスチャ アドレスにバインドされていると思わせます。これは私が望む効果ではありません。なぜなら、描画時にどのテクスチャをユニフォームに渡す必要があるかをプログラマーが明示的に述べられるようにしたいからです (他のユニフォームが設定されているのと同じように)。
テクスチャをサンプラーに渡すにはどうすればよいですか? テクスチャをバインドするときに何を変更する必要がありますか?
xna - 複数のテクスチャを使用して XNA4 で円柱をテクスチャリングする方法は?
基本的には、スロット マシンのリール (白い円柱モデル) を外側に複数の等間隔のテクスチャでカバーしようとしています。プログラムは Windows 専用で、コンテンツ パイプラインを使用する代わりに、実行時にテクスチャが動的に読み込まれます。(Microsoft の例からの XNA を使用した Windows ベースのマルチスクリーン セットアップ)
私がオンラインで見つけることができる例のほとんどは XNA3 用であり、この時点ではまだ意味不明に思えます。
だから私は誰かが複数のテクスチャを持つ円柱のようなオブジェクトのゲーム内テクスチャリングに関して提供できる助けを探しています.
XNA (特に 4.0) でテクスチャリングがどのように機能するかを適切に説明できる優れた本があるのではないでしょうか?
ありがとう
opengl - OpenGLテクスチャリングメッシュFrontSideおよびBackSide
私はOpenGLの経験がありません(そして私の質問はこれを証明しています)が、問題を解決するために少しスニペットが必要です。メッシュと正方形があり、2つのテクスチャを適用する必要があります。1つはFrontSide、もう1つはBackSideです。これは、テクスチャの前面を適用するためのコードです。
誰かが私を助けることができますか?
1]表側と裏側に2つの異なるテクスチャを適用することは可能ですか?
2]誰かがスニペットを投稿したり、チュートリアルやその他の資料を示したりすることができますか?
ありがとう。