タグ付けされた質問 「opengl」

オープングラフィックライブラリ-2Dおよび3Dコンピュータグラフィックス用のAPI


3
ハードウェアアクセラレーション付きのベクターグラフィックスが削除されないのはなぜですか?
私は、60fpsでベクターパスをリアルタイムで操作するアプリを開発していますが、このテーマに関する情報が非常に少ないことに非常に驚いています。最初は、CoreGraphicsを使用してアイデアを実装しようとしましたが、目的に対して十分に機能しませんでした。それから、OpenVGと呼ばれるハードウェアアクセラレーションベクターグラフィックス用のKhronos標準があり、ありがたいことに、親切な魂がMonkVGと呼ばれるOpenGL ES準実装を書いていたことを発見しました。 しかし、OpenVGは非常に実用的なAPIであるという事実にもかかわらず、多かれ少なかれKhronosによって放棄されているようです。ウィキペディアによると、2011年以降、ワーキンググループは「さらなる標準化のために定期的な会議を開催しないことを決定しました」。私が見つけられる最高のドキュメントは、たった1枚のリファレンスカードで構成されています。さらに、インターネット上のどこにもOpenVGの例はほとんどありません。瞬く間に何百ものOpenGLチュートリアルを見つけることができますが、OpenVGは著しく欠落しているようです。 ハードウェアアクセラレータを使用したベクトルは、解像度が急速に向上する今日の世界でより重要になると思われます。多くの企業が独自の方法でこれを実装しているようです。たとえば、QtとFlashにはハードウェアアクセラレーションベクターのスキームがあり、アドビのツールの多くにはオプションとしてハードウェアアクセラレーションがあります。しかし、標準がすでに存在する場合、ホイールは再発明されつつあるようです! OpenVGが実世界での使用に適していないことについて、私が不足しているものはありますか?それとも、標準が間に合わなかっただけで、今ではあいまいになっているのでしょうか?将来、ハードウェアアクセラレーションベクターグラフィックス用の標準化されたAPIの余地があると思いますか、それとも従来のラスターベースの技術を使用する方が簡単でしょうか?それとも、ベクターは、出入りする前に単に出て行くところにありますか?

14
DirectXが左手座標系を使用するのはなぜですか?
Stack Overflowに投稿することを検討しましたが、この問題に関するMicrosoftの選択に対する合理的な技術的説明を考えることができないため、質問はあまりにも主観的であると思います。しかし、この質問は非常に長い間私を悩ませており、私のプロジェクトの1つで問題が発生し続けており、実際にこれを説明する試みを見たことはありません。 OpenGLは、右手座標系を使用します。世界座標系の+ Z部分は、視聴者に向かって伸びます。 DirectXは、世界の+ Z部分は座標左手系が延び使用に見る人から離れて、スクリーン。 私はGlide APIを使用したことがないため、どのように機能したのかわかりませんが、収集できるものから、左利きのシステムも使用しています。 これには技術的な理由がありますか?そうでない場合、座標系の特定の利き手に概念的な利点はありますか?なぜ一方が他方を選択するのでしょうか?
52 math  directx  opengl 

7
パフォーマンスのためにCで作成しますか?[閉まっている]
Cは通常C ++よりもパフォーマンスが優れているとよく耳にします。MSVCがCの最新の標準をサポートしていないように思えるまで、それ以外のことは何も考えていませんでしたが、最新のものはC99をサポートしています(私の知る限り)。 OpenGLでレンダリングするためのコードを含むライブラリを作成して、再利用できるようにすることを計画していました。グラフィックに関しては、パフォーマンスの向上を歓迎するため、ライブラリをCで作成することを計画していました。 しかし、それは本当に価値があるでしょうか?ライブラリを使用するコードはおそらくC ++で書かれているため、一般的にはC ++でコーディングすることを好みます。 ただし、パフォーマンスにわずかな違いさえ生じる場合は、Cを使用します。 また、このライブラリは、Windows / OS X / Linux全体で動作するようにするものであり、すべてをネイティブにコンパイルする可能性があります(Windows用のMSVC、OS X用のClangまたはGCC、およびLinux用のGCC)。 。またはおそらくすべてのインテルのコンパイラ)。 私は周りを見回し、いくつかのベンチマークなどを見つけましたが、私が見たものはすべて、MSVCとClangではなくGCCを扱っています。また、ベンチマークでは使用言語の標準については言及していません。誰もこれについて考えていますか? 編集:数年以上の経験を経て、この質問に対する私の見解を共有したかっただけです。C ++でこの質問をしていたプロジェクトを書くことになりました。私は、Cでリンクできるようにするために、できる限り少量のパフォーマンスを引き出したいと考えていたのと同じ頃に、Cで別のプロジェクトを開始しました。数ヶ月前、私は本当にマップと高度な文字列操作。私はC ++標準ライブラリのこの能力を知っていて、最終的に標準ライブラリのそれらの構造は、妥当な時間内にCで実装できるマップや文字列よりもパフォーマンスが高く安定しているという結論に達しました。Cでリンク可能であるという要件は、C ++コードへのCインターフェイスを記述することで簡単に満たされました。これは、不透明(OPAQUE)型で迅速に行われました。C ++でのライブラリの書き換えは、Cでの書き込みよりもはるかに高速であるようで、バグ、特にメモリリークが発生しにくい傾向がありました。プラットフォーム固有の実装を使用するよりもはるかに簡単な標準ライブラリスレッドライブラリを使用することもできました。最終的には、C ++でライブラリを作成することで、パフォーマンスコストをわずかに抑えながら大きなメリットを得ることができたと思います。私はまだC ++バージョンのベンチマークを行っていませんが、私が書いたものよりも標準ライブラリのデータ構造を使用することで、ある程度のパフォーマンスを得た可能性さえあると信じています。ライブラリをC ++で記述すると、パフォーマンスコストはおそらくわずかですが、大きなメリットが得られたと思います。私はまだC ++バージョンのベンチマークを行っていませんが、私が書いたものよりも標準ライブラリのデータ構造を使用することで、ある程度のパフォーマンスを得た可能性さえあると信じています。ライブラリをC ++で記述すると、パフォーマンスコストはおそらくわずかですが、大きなメリットが得られたと思います。私はまだC ++バージョンのベンチマークを行っていませんが、私が書いたものよりも標準ライブラリのデータ構造を使用することで、ある程度のパフォーマンスを得た可能性さえあると信じています。

5
最新のライブラリがOOPを使用しない理由
私は初心者レベルのC ++プログラマですが、言語の概念はかなりよく理解しています。SDLやOpenGLなどの外部C ++ライブラリを学習し始めたとき、驚いたことに、C ++の概念をまったく使用していないことがわかりました。 たとえば、SDLもOpenGLもクラスや例外を使用せず、関数とエラーコードを優先します。OpenGLでは、glVertex2fのような関数を見てきました。これは、入力として2つのfloat変数を取り、おそらくテンプレートとしてはより良いでしょう。さらに、これらのライブラリは時々marcosを使用しますが、マクロの使用が悪いことは一般的な合意のようです。 全体として、C ++スタイルよりもCスタイルで記述されているようです。しかし、それらはまったく互換性のない言語ですよね? 問題は、なぜ現代のライブラリは、それが書かれている言語の利点を使用しないのかということです。

4
OpenGL、GLX、DRI、およびMesa3Dの関係は何ですか?
Linuxで低レベルの3Dプログラミングを始めています。私は、高レベルのグラフィックスAPI OpenInventorを使用した経験が豊富です。 これらのすべてがどのように組み合わされるかを知ることは厳密に必要ではないことを知っていますが、私はただ興味があります。OpenGLはグラフィックアプリケーションの単なる標準であることは知っています。Mesa3Dは、この標準のオープンソース実装のようです。 では、GLXとDRIはどこに適合するのでしょうか?ウィキペディアとこれらすべてのウェブサイトを掘り下げて、私はまだそれがどのように連携するかについての正確な説明をまだ見つけていません。ハードウェアアクセラレーションはどこで発生しますか?プロプライエタリなドライバーはこれと何の関係がありますか?

3
OpenGLのグラフィックコードで最も効果的な自動テストをどのように単体テストまたは実行しますか?
C ++でOpenGLの上にゲームとそれに付随するグラフィックエンジンを書いています。また、優れたコーディングプロセスと自動テストのファンでもあります。出力は多くの場合視覚のみであるか、非常に視覚指向であるため、グラフィックスコード+テストは非常に混同しにくいようです。 たとえば、画面にバイト単位でレンダリングされる生の画像ストリームを分析することを想像してください-比較するテストデータが必要で、作成/取得が難しく、レンダリングされた画像はしばしば同じではありません異なる時間に実行する場合のバイトレベル-アルゴリズムの小さな変更は、このアプローチを完全に破壊します。 視覚的な単体テストスイートを作成することを考えています。基本的に、さまざまなテストシーンをレンダリングし、シャドウマッピング、アニメーションなどのようなものを表示できます。CIの一部として、これらのシーンはビデオにレンダリングされます異なるメトリックのファイル(または実行可能ファイルとして残すこともできます)。ビデオファイルの手動検査が必要になりますが、少なくともある程度自動化および標準化されます。 どう思いますか?もっと良い方法がありますか?

2
HaskellのGUIライブラリに関する提案[終了]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新することがありますので、上のトピックソフトウェア工学スタックExchange用。 5年前に閉鎖されました。 以下のようハスケルウィキ自身が述べています: Haskellには多くのGUIライブラリがあります。残念ながら、標準的なものはなく、すべてが多かれ少なかれ不完全です。一般に、低レベルのベニヤは順調ですが、低レベルです。高レベルの抽象化は非常に実験的です。サポートされている中レベルのGUIライブラリが必要です。 私の大学の教授は、私と他の3つのコンピューターサイエンス専攻にHaskellのGUIライブラリを検討するように依頼しました。このプロジェクトに対する彼の最初のアイデアは、Smalltalkにあるモーフィックライブラリを模倣したOpenGLの上にレイヤーを書くことでした。ただし、これは単なる提案であり、他のシステムは間違いなく検討する価値があります。 これは、実際の複数の部分からなる質問につながります。 ライブラリはどのレベルの抽象化のために努力すべきですか?Haskell Wikiは、中レベルのGUIライブラリが推奨されることを強く示しているようです。ただし、高レベルのライブラリは引き続き歓迎されます。 ライブラリを何に構築する必要がありますか?(例:OpenGL) 私たちのライブラリーを模倣したい既存のGUIライブラリー(もしあれば)とその理由は何ですか?(例:PyGame、Morphic、Swingなど) ライブラリの実装または回避を希望する機能は何ですか?たとえば、Gnomeの良き人々は、最小化ボタンは不要だと主張するかもしれません。 一般的な提案はありますか? この架空の図書館にどんな名前を付けますか?(例:HOT-Haskell Opengl Toolkit; HAWT-Haskell Advanced Windowing Toolkit)

3
Android、OpenGL、GLSurfaceViewの拡張?
この質問は、部分的に技術的、部分的にメタ、部分的に主観的で、非常に具体的です。 私はインディーズのゲーム開発者であり、Androidに取り組んでいます。過去6か月間、苦労し、ついにAndroid用の3Dゲームアプリを作成することに成功しました。だから私はSOに飛びついて、アンドロイドとopenGL-ESで苦労している他の人を助けると思った ただし、質問の大部分は拡張に関するものGLSurfaceViewです。拡張せずにアプリ全体を作成しましたGLSurfaceView(そして正常に動作します)。私がGLSurfaceView出くわした質問の大部分に及ぶ理由はまったくありません。 さらに悪いことに、アンドロイドのドキュメントはあなたがすべきであることを暗示していますが、長所/短所がなぜあるのかGLSurfaceView.Renderer、私がやったようにあなた自身を実装してすべてを実行していないのかについての詳細な説明は提供していません それでも、問題が純粋に拡張に関係している膨大な質問は、GLSurfaceView実際に私がそれを行っている方法と他の方法でそれを行うための本当に良い理由があるのか​​どうか疑問に思っていますする)。 だから、私が見逃しているものがありますか?その間に質問に答えるのをやめるべきですか? Android OpenGLドキュメント
12 android  opengl 

1
プロファイリングツールが使用できない場合、プログラムのパフォーマンスを最適化するにはどうすればよいですか?
現在、パフォーマンスを改善したいOpenGlプログラムに取り組んでいます。パフォーマンスは大丈夫ですが、強力な専用GPUでは理想的ではありませんが、統合グラフィックス(<10 fps)ではひどいです。通常のプログラム(CPUベース、OpenGlまたは他のGPU APIなし)では、プログラムでプロファイラー(おそらくCLionに組み込まれているもの)を実行し、ほとんどの時間を費やしている場所を確認してから、より良いアルゴリズムで作業しますそれらのエリアの場合、またはそのエリアが呼び出される量を減らす方法を見つけます。 OpenGlプログラムでこの手法を使用すると、メインスレッド(最適化したいスレッド)でのプログラムの時間の大部分(約86%)がOpenGlドライバーの.soファイルに費やされていることがわかります。さらに、プログラムの実行中のCPU使用率は非常に低いですが、GPU使用率は95%から100%の間で停止します。これらの情報を総合すると、ボトルネックがGPUにあるため、最適化する必要があることがわかります。 ここで問題が発生します。ただし、プロファイラーを使用して私の最適化を導く通常のテクニックは、特定のGPUプロファイラーがないと機能しません。そのため、GPU処理時間が費やされている場所を教えてくれるプロファイラーを見つけるために、いくつかの調査を行いました。リモートで使用できるものは何も見つかりませんでした。すべてがWindowsのみ(Linuxのみを実行しており、プログラムはまだWindowsに移植されていません-ずっと先までは移植されません)であるか、更新されていないか、および/またはこのプロジェクトです。 そのため、私は質問します。関連するプロファイラーが存在しない場合、プログラムのパフォーマンスをどのように最適化できますか?問題がどこにあるのかを推測し、そこから最適化を試みましたが、最適化(錐台カリング)によってGPUの作業が約半分になっていることが確認できたとしても、違いはありませんでした。良い答えは、Linux上のOpenglに適用可能なプロファイリング手法を提供するか、プロファイラーなしで機能する手法を提供することです。

1
ハードウェアアクセラレータのGUIデータはGPUに保持されますか
ほとんどのハードウェアアクセラレーションGUIライブラリがどのように機能するかについて、いくつかの調査を行っています。ここでは、実際にはそれらのレンダリングバックエンドのみに関心があります。私は、自分自身をある種のサイドプロジェクトとして書き、書くための最良の方法を理解しようとしています。ここでは、過度に凝った機能ではなく、究極のパフォーマンスを目指しています。プリミティブ、テキスト、アニメーションを描けるようになりたいです。 私が知っているいくつかの優れたライブラリーは、Qt、Skia、およびCairoです(ただし、HWAの状況が何であるかはわかりません)。私はまた、きちんとしたフォローがあるように見える小さなライブラリーであるNanoVGを見ました。私はNanoVGでまともなパフォーマンスを達成することができませんでした... 私を驚かせた唯一のことは、これらのライブラリすべてが「ペイント」の概念を利用しているようであり、各プリミティブ形状が最初から何度も描かれているように見えることです。つまり、APIからは、形状がGPUで「オブジェクト」として作成されたかのように表示されず、用語が何であれ、そこに残されて「自動」でレンダリングされるわけではありません。言い換えると、それらは、いくつかの大きなループで再描画されるためにGPUのメモリに残されません。詳しく説明すると、描画する必要がある各ie長方形に対して、その長方形をレンダリングするためだけにOpenGL状態全体が設定され、その後再び破棄されるようです。これらのレンダリングされた形状は、少なくとも最終的な宛先でレンダリングされているように見えますが、GPUはシーン全体を構成できます。 これらのライブラリが機能することを期待していた方法は、実際にシーン全体をGPUに保存することです(恐ろしい用語を除きます)。たとえば、プリミティブは三角測量されてメモリに残され、その後、複雑なプロセスを使用してシーンのメインレンダリングループが作成されます。さらに、属性を更新したり、プリミティブを削除または追加するためのメカニズムが配置されます。これはかなり漠然とした説明ですが、あなたはアイデアを理解していると思います。 私が今聞きたいのは、「保存」アプローチと比較して「ペイント」アプローチにパフォーマンス上の利点があるかどうかです(ここでも、これらに適切な名前があるかどうかわかりません...)。おそらく、ある種の複雑なキャッシングメカニズムですか?それとも、これで作業する方がはるかに簡単ですか? 「保存」アプローチではGPUでより多くのメモリを使用する可能性がありますが、「ペイント」アプローチに必要なすべてのOpenGL呼び出しはそれほど高価ではありませんか?レンダリングされた形状をキャッシュすることでこれを補正できるかもしれないと思いますが、GPUは、特に通信を考慮して、CPUに比べてこのような一度限りの(またはあまり規則的でない)ラスタライゼーションを実行するときに非常に大きなメリットを提供しますオーバーヘッド?また、この通信のオーバーヘッドは、フレームごとに描画を行わなければならないときに、アニメーションに深刻な問題を引き起こしませんか? NanoVGに内部キャッシングメカニズムがないことは確かであり、これがかなり劣ったパフォーマンスの原因であると思います。一方、Qtは優れたパフォーマンスを持っているように見えるので、正しく動作しているはずです。グーグルもスキアを上手く利用できるようだ。 PS。私はあらゆる種類の専門家ではなく、つい最近OpenGLを学び始めました。 編集:私が考えたもう1つの可能性は、おそらく「描画」アプローチが純粋にメモリの利点のために必要であると考えられたということですか?私が思うのは、これらのすべてのライブラリはもちろん別の時代に始まったものであり、組み込みプラットフォームもターゲットにしているため、GPUメモリはターゲット(ed)プラットフォームでは不足している可能性があり、使用量は可能な限り少ないためです。パフォーマンスよりも重要です。繰り返しになりますが、このような状況では、通信オーバーヘッドがCPUを上回っていることを考えると、フレームごとのGPUラスタライゼーションがCPUよりも優れているとは確信できません。 さらに、http://blog.qt.io/blog/2010/01/06/qt-graphics-and-performance-opengl/を読んだところ、Qtは実行時にプリペイントされたセグメントのシェーダーコードを実行時に「ペイント」する前にブレンドし、次に、OGLコンパイラーが実行時にコードを適切にインライン化することを期待しています。これは、OGLの初期化オーバーヘッドがさらに増えるように思えます...
8 gui  qt  opengl  gpu 

3
ハンドルやManagerを渡さずにオブジェクトのハンドルを管理するのに最適なデザインパターンはどれですか。
OpenGLを使用してC ++でゲームを作成しています。 知らない人のために、OpenGL APIを使用して、などの多くの呼び出しをglGenBuffers行いますglCreateShader。これらの戻り値の型は、GLuint作成したものに対する一意の識別子です。作成されるものはGPUメモリ上に存在します。 GPUメモリが制限されている場合があることを考えると、複数のオブジェクトで使用されるときに同じものを2つ作成したくない場合があります。 たとえば、シェーダー。あなたは、シェーダプログラムをリンクして、あなたが持っていますGLuint。シェーダーを使い終わったら、呼び出す必要がありますglDeleteShader(またはそれに影響を与える何か)。 ここで、次のような浅いクラス階層があるとします。 class WorldEntity { public: /* ... */ protected: ShaderProgram* shader; /* ... */ }; class CarEntity : public WorldEntity { /* ... */ }; class PersonEntity: public WorldEntity { /* ... */ }; 私が今まで見たどのコードでも、すべてのコンストラクターにShaderProgram*渡して、に格納する必要がありWorldEntityます。ShaderProgramは、GLuintOpenGLコンテキストでの現在のシェーダー状態へののバインディングと、シェーダーを使用するために必要な他のいくつかの役立つことをカプセル化する私のクラスです。 私がこれで持っている問題は: を構築するために必要な多くのパラメーターがありますWorldEntity(メッシュ、シェーダー、多数のテクスチャーなどがあると考えてください。これらはすべて共有できるため、ポインターとして渡されます) どのような作成されたWorldEntityかを知る必要性をShaderProgramそれが必要 これはおそらく、異なるエンティティに渡すもののインスタンスを知っているある種のgulp EntityManagerクラスを必要としますShaderProgram。 つまりManager、クラスが必要なインスタンスEntityManagerとともにに自分自身を登録する必要があるかShaderProgram、switch新しいWorldEntity派生型ごとに更新する必要がある、マネージャの大物が必要なためです。 私が最初に考えたのは作成することでしたShaderManager(私は管理者が不良である、知っている)私はへの参照やポインタで渡すというクラスをWorldEntityので、彼らは何でも作成することができますクラスShaderProgramを経由して、彼らが望むShaderManagerとShaderManager、既存のトラックに保つことができShaderProgram、それができるよう、秒すでに存在するものを返すか、必要に応じて新しいものを作成します。 (私ShaderProgramはShaderProgramsの実際のソースコードのファイル名のハッシュを介してsを保存できます) だから今: …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.