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

OpenGLグラフィックスライブラリの使用に関する質問。

2
OpenGL-エッジの検出
任意のメッシュをロードし、エッジに沿って太い黒い線を描画して、トゥーンシェーディングのような外観にします。ステンシルバッファーを使用して、オブジェクトの周りに黒いシルエットを描くことができました。あなたはここで結果を見ることができます: しかし、欠けているのはオブジェクト自体の黒い線です。法線の不連続性をチェックすることを考えました:隣接するピクセルが現在のものとは異なる法線ベクトルを持っているかどうかをチェックします。はいの場合、エッジが見つかりました。残念ながら、OpenGLでもGLSL頂点/フラグメントシェーダーでも、このアプローチをどのように実装できるかわかりません。 このアプローチやエッジ検出に関するその他のサポートについて、私はとても嬉しく思います。 編集:メッシュにテクスチャを使用していません。 もっと正確に言うと、次のように見えるCAD / CAMソリューションを作成したいと思います(Top Solid https://www.youtube.com/watch?v=-qTJZtYUDB4から取得):

1
シェーダーのループパフォーマンス
動的ループ関数をシェーダーに統合するための最良の方法は何ですか? まず、動的配列は不可能であるようです。では、最大サイズの配列を作成し、その一部のみを埋めるか、定義済みのサイズで配列を定義する方が良いでしょうか? 次に、この配列を反復処理する最良の方法は何ですか? 4〜128回の反復で、展開されたループまたは動的ループを使用する方が良いですか。また、事前定義された最大反復回数まで展開してから、などの条件で停止できることも確認しましたif (i == myCurrentMaximumIterationNumber)。

1
シェーダープログラムを変更するときに、ユニフォームまたは属性を再バインドする必要がありますか?
シーンのレンダリングには通常、複数のシェーダープログラムが含まれます。私の場合、すべてが同じ属性を使用し、少なくともいくつかのユニフォームを共有しています。それらを適切に機能させるために、私は現在安全にプレイしています。つまり、シェーダープログラムを切り替えるたびに属性を再バインドし、適切な均一の場所を取得しています。したがって、基本的に各フレームで複数回実行することは、おそらく最善の方法ではありません。 では、シェーダープログラムを切り替えた後、(一般的に)属性とユニフォームを再バインドする必要がありますか?なぜ? もしそうなら、これをプログラムの開始時に一度行い、再びそれらに触れる必要がない方法はありますか?
11 opengl  glsl  shader 

4
OpenGLを学ぶかDirect3Dを学ぶかは重要ですか?
これら2つのAPIの違いはマイナーな実装の詳細ですか?それは、一度学んだらすべてに使用できるということですか?または、将来的に別のAPIを再学習する必要なく一般的に使用できるようにしたい場合、どちらか一方を学習する理由はありますか?どちらか一般的ですか? 特に、どのグラフィックスカードでも書き込めるようにしたいので、コードは特定のメーカーのカードや特定のモデルでのみ実行されるように制限されていません。また、グラフィックスカードがなくても動作するコードは記述できるようになりたいと思っています(遅いですが)。 異なるプラットフォーム(オペレーティングシステム/アーキテクチャ)間で移植可能なコードがどのようになるかには違いがありますか?これらと連携する他のライブラリーが入手可能かどうか、そしてどちらか一方が広い環境でのライセンス制限を減らすかどうかに興味があります。これらの1つが私を制限することなく私が学ぶ唯一のものであるかどうかに違いをもたらす測定可能なもの。
11 opengl  api  direct3d 

2
ステンシルテストでいくつの断片が作成されたかを調べることはできますか?
私はステンシルテストを非常に広範囲に使用して不規則な形状をレンダリングするOpenGLアプリケーションを持っています(単純な2D CSGと少し似ています)。ステンシルテストに合格して実際にレンダリングされたフラグメントの数を確認できれば、これは一部の計算を簡略化するのに非常に役立ちます。具体的には、後でモンテカルロシミュレーションで近似する必要がなく、レンダリングされた形状の領域を無料で決定できます。 ジオメトリシェーダーから放出されるプリミティブにも、変換フィードバックと呼ばれる同様の概念があることを知っています。同様のコンセプトがフラグメントとステンシルテストに存在するかどうか知りたいのですが。

1
テクスチャの変更(その上でのペイント)は、「状態変化」と見なされますか?
グラフィックスの慣例では、状態変更をより少なく実行する方が、より多くの状態変更を実行するよりも優れています(シェーダーの切り替え、バッファーのバインド、テクスチャのバインドなど)。テクスチャの場合、(スプライト/テキストをレンダリングするために)1つのアトラスを使用して多くのポリゴンをレンダリングする方が、各ポリゴンに新しいテクスチャを個別にバインドするよりも高速です。 継続的にテクスチャにペイントしている場合、これは当てはまりglTexSubImage2Dますか?(ネットワークを介して)入ってくるデータのストリームがあり、処理を経て、一度に1行ずつテクスチャーにペイントされます。データは視覚的に無限のスクロールで表示されます。 1つの大きな長方形にレンダリングされた1つのテクスチャにペイントする方がよいでしょうか(ペイントされたデータをスクロールして表示します)。ここでのアイデアは、ペイントを続けている間、いつでも1つまたは2つのテクスチャをバインドすることです。 または、たくさんの小さな長方形をペイントする必要がありますか(ペイントが完了すると長方形のみが表示されます)。長方形ごとに1つのテクスチャをバインドするとします。
11 opengl  texture 

2
四角形を長方形に投影解除する方法は?
tl; dr:射影ジオメトリの数学の問題:点A、B、C、Dがユニットボックスの端のどこかにあるように、以下に示すように投影を与える4x4カメラマトリックスをどのように見つけますか(例:OpenGL正規化デバイス)座標)、およびユニットボックスのコーナーは、光線EA、EB、EC、EDに沿って妥当な場所に落ちますか? (これは、ホモグラフィ、パースペクティブ、および/またはコリネーションの特殊なケースである可能性があります。用語に精通していません。) 精巧 ビューポート内に四角形のABCDがある場合、それを長方形にマッピングする一意の変換(?)が存在すると思います。下の画像に示すように、ビューポートの四角形のABCDは物理的な「ウィンドウ」として機能し、長方形にマッピングすると、歪んで表示されます。 (右側のボックスは、後で説明するNDCを表します) 目標は、右側の画像をすばやく取得することです。画像を取得するためにすべてのポイントをレイトレーシングできます(私はこれを行いました)が、ブレンドやプリミティブなどのようなものを利用したかったので、OpenGLまたは他の射影技法を使用したいと思います。 最初の試み 3 + 1次元の均一座標を3空間(左側)にし、それを2空間の2 + 1次元の均一座標(下)に投影する3x4 カメラマトリックスを見つける問題を解決できると思います。権利)。直接線形変換を使用してこれを解決し、カメラマトリックスの未知のエントリの方程式系を取得し、特異値分解を使用してシステムを解くことができます。Ba=0a(SVD)。私はベクトルEA、EB、EC、ED(Eはあなたの物理的な目またはワールドスペースのカメラ)をプレイメージのポイントとみなし、(0,0)、(1,0)、(1 、1)、(0,1)またはポストイメージ内のポイントとしての何か、およびポイントの各ペアは、SVDにプラグインするいくつかの線形方程式を与えます。結果の行列はEA->(0,0)などをマップします(十分な自由度があると仮定します。つまり、解が一意であるかどうかは不明です。注[a]を参照してください)。 しかし、私の悔しさにこれはOpenGLがどのように機能するかではありません。OpenGLは、3x4マトリックスで3dを2dに直接投影しません。OpenGLには、3次元の点である「正規化デバイス座標」(NDC)が必要です。NDCに投影した後、「ユニット」ボックス内の(-1、-1、-1,1)から(1,1,1,1)までのすべてが描画されます。外のすべてが切り取られます(同種の座標を扱っているため、任意の点(x、y、z、w)が画面に表示されるのは、(x / w、y / w、z / w 、1)は-1から1)までのユニットボックス内にあります。 したがって、問題は次のようになります。いくつかの奇妙に見える立方体を同次座標(具体的には、ABCD(フロントポイント)とA'B'C'D '(バックポイント、非表示)で左側に描かれた立方体)にマッピングする合理的な変換が存在しますか。フロントポイントの後ろに))ユニットキューブに、例えば4x4マトリックスを使用して?どうやってやるの? 私が試したこと 私はより強力なものを試しました:ABCDとA'B'C'D 'を通常のピラミッド型錐台(例:gl錐台)のように見せました(つまり、この架空の設定では、左側の画像に黒い長方形が重なっているだけです)四辺形ではなく)、DLT /直接線形変換を使用して、疑わしい4x4行列を解きました。しかし、試してみたところ、十分な自由度がないようでした...結果の4x4行列は、すべての入力ベクトルをすべての出力ベクトルにマップしませんでした。A、B、C、D、A '(5組の変換前ベクトルと変換後ベクトル)を使用している間、私は/ほぼ/私が望む結果を得ます...ベクトルは正しくマッピングされていますが、たとえばB'、 C '、D'は(-1、-1,1,1)ではなく(3,3,1,1)にマッピングされ、OpenGLによって切り取られます。6番目の点(4x4マトリックスが投影する6組の点)を追加しようとすると、私の解は縮退しているようです(ゼロ、無限)。ここではいくつの自由度を扱っていますか?これは、私たちが知っており、気に入っている通常の4ベクトル(3 + 1次元の同次座標ベクトル)をマッピングする4x4マトリックスで可能ですか? ランダムなマイナーな考え 4x4マトリックスで任意の立方体を任意の立方体にマッピングすることは不可能だと思いますが、2Dのような任意の凸四角形を他の凸四角形に2Dでマッピングすることは可能だと思ったので混乱します、例えば、Photoshop?...これは射影変換ではできませんか?そして、それはどのように3Dに一般化されますか?......また、4x4行列を見つける試みが失敗した場合、線形代数は、NxN行列が最良の場合にN個を超える線形独立点をN個の目標点にマッピングすることを期待すべきではないと言いますが、どういうわけか均一だと思いますいくつかの隠れた共線性が進行しているため、座標はこれをだますのですか?違いますか? 別の解決策? 典型的な錐台カメラの射影行列を使用して、コーナーに対応する2Dポイントを見つけ、2Dパースペクティブディストーションホモグラフィを実行することもできますが、それがピクセルがレンダリングされた後に発生した場合(フォトショップなど)解像度に問題があります...おそらく、仮説的にNDC空間内のXY平面でこの変換を実行するための行列を見つけ、それを通常の錐台ベースの行列で構成できますか? (注[a]:自由度:ABCDは、必要に応じて、長方形に作用する射影変換のポストイメージになるようにさらに制約できます...つまり、左側の黒い長方形は、画像フレームのクリップアートモデルを投影した結果)

2
OpenGLよりもDirect3Dを選ぶ理由はありますか?
私が読んでいたので、これを、私は一種の他のどのOSよりも、MicrosoftのWindows上でより多くのゲームがある理由を得ました。提示された主な問題は、Direct3DがOpenGLよりも優先されることでした。 開発者が互換性を犠牲にするのはなぜですか?それは単に会社の財務上の損失です。OpenGLはごちゃごちゃのようなものですが、専門家にとってそれが問題になることはまずないでしょう。たとえそれがあったとしても、人々は経済的損失を被るよりも一歩進んでいくと思います。 また、私が間違っていなければ、多くのクロスプラットフォームアプリケーションがDirect3DとOpenGLの両方を使用します。APIを切り替えると思います。 彼らがOpenGLを使用できるのでこれは奇妙です、なぜDirect3Dまで気にかけるのですか? だから問題は、OpenGLに技術的な問題があるのか​​、それともOpenGLに欠けているDirect3Dのサポートがあるのか​​ということです。 この質問はトピックから外れている、または範囲が広すぎるとして閉じられている可能性があることを認識しています。絞り込んでみました。
10 opengl  direct3d 

1
ユニフォームの整列と宣言の順序は重要ですか?
「Practical Rendering&Computation with Direct3D 11(pages 325、326)」のセクション6.4 Constant Buffersで言及されています。 デフォルトでは、HLSLコンパイラーは定数が複数のfloat4レジスターにまたがらないように定数を調整しようとします。[...] HLSL定数バッファーのパッキングは、packoffsetキーワードを使用して手動で指定することもできます。 同じハードウェア機能にマップするため、OpenGLの同等のUniform Bufferオブジェクトにも同様のルールが適用されると思います。 バニラのユニフォームはどうですか?ユニフォームを宣言するときに適用されるルールは何ですか? uniform vec2 xy; // Can we expect the compiler to pack xy uniform vec2 zw; // into a same four component register? uniform vec2 rg; uniform float foo; // Will this prevent from packing rg and ba? …

2
にきびの原因
シャドウマッピングのしくみはわかっていますが、シャドウニキビの原因がわかりません。誰でも簡単にシャドウニキビの原因を教えてもらえますか?それはデプスマップの解像度とどのように関連していますか?

4
最新のOpenGLを備えた複数のビューポート?
私はSDL2を使用しています。 現在、私の唯一のシェーダーにはMVPマトリックスがあり、それを使用してポイントを変換します。 GLMを搭載したカメラのビューと投影行列を計算します。 glm::lookAt(pos, pos + forward, up); glm::perspective(fov, aspectRatio, zNear, zFar); 検索しましたが、複数のビューポートのレガシー実装しか見つかりません。 たとえば、4つのカメラを作成して、すべてのカメラが同じであるとしましょう。ただし、すべてのカメラには、レンダリングする画面の四分の一が異なります。(つまり、同じ内容の4つのビューポートが必要です) これどうやってするの?十分な情報を提供できなかった場合は、申し訳ありませんが質問してください。
9 opengl  glm 

1
OpenGL GLSL-Sobelエッジ検出フィルター
このトピックに関しては、GLSLにSobel Edge Detectionフィルターを正常に実装しました。フィルターのフラグメントシェーダーコードを次に示します。 #version 330 core in vec2 TexCoords; out vec4 color; uniform sampler2D screenTexture; mat3 sx = mat3( 1.0, 2.0, 1.0, 0.0, 0.0, 0.0, -1.0, -2.0, -1.0 ); mat3 sy = mat3( 1.0, 0.0, -1.0, 2.0, 0.0, -2.0, 1.0, 0.0, -1.0 ); void main() { vec3 diffuse = texture(screenTexture, …

1
スキャン変換中のサンプルギャップとは何ですか?
で、このチュートリアル、 エッジを共有する三角形がレンダリングされることがよくあります。OpenGLは、共有されたエッジの頂点位置が同一である限り、スキャン変換中にサンプルのギャップがないことを保証します。 1スキャン変換中のサンプルギャップとは正確には何ですか? 2どのような状況で起こりますか? 3ラインがフラグメントの中心を横切るときに起こりますか?

1
GPUで共有頂点法線を作成する
私は、CPUからOpenGLコンピューティングシェーダーへのマーチングキューブの実装の移植にほとんど成功しましたが、私はまだ法線に取り組んでおらず、そのための最善の方法を考えていません。 私の実装では特にバイナリ値フィールドを扱います(まだ距離推定器を持たない3Dフラクタル関数をモデル化しようとしているため)、勾配法と前方差分法は機能しません。動作する頂点を共有しました。私のCPU実装では、ここで説明するQuilezの方法を使用して、隣接する各頂点に面法線を蓄積します。 この実装を別のシェーダーに移植することもできますが、これで発生する問題は、必要なアトミックの膨大な数です。私たちはスカラー整数型でのみアトミックを使用でき、3つの符号付き整数を合計可能な方法で1にパックする方法を考えることができないので、シェーダー呼び出しごとに3軸* 3頂点= 9アトミック追加を意味します。もちろん、それらはメモリ全体に分散されるため、1つのアトミックカウンターを9回ヒットするようなものではありませんが、それでもまだかなりのようです。 もう1つの方法は、ポリゴンごとのシェーダー呼び出しを実行して面の法線リストを作成し(おそらくこの方法でx10y10z10にパックすることができます)、次に頂点ごとのシェーダーで隣接する面の法線をすべて蓄積します。ただし、これは膨大なメモリを消費しますが、最悪の場合に対処するには、面インデックスのストレージスペースに頂点ごとに12 intが必要になります。また、特定の頂点に既に書き込まれている面の数を計算するためにアトミックに頼らずに、このストレージに書き込む方法の問題もあります。 誰でもこれを行う方法についてもっと良いアイデアがありますか?

1
OpenGLテッセレーションでの頂点ごとの計算
ハードウェアテッセレーションを使用して、位置ベースのクロスシミュレーションを実装しようとしています。つまり、コントロールクワッドをグラフィックスカードにアップロードし、テッセレーションとジオメトリシェーディングを使用して、クロスにノードを作成します。 このアイデアは論文に従います: Huynh、David、「ハードウェアテセレーションを使用したクロスシミュレーション」(2011)。定説。ロチェスター工科大学 http://scholarworks.rit.edu/theses/265/ テッセレーションを使用してシミュレーションポイントを作成する方法を知っています。私が知らないのは、計算された情報をフレームバッファに格納する方法です。 ジオメトリとテッセレーション評価シェーダーには、頂点ごとの計算に必要な情報があります。しかし、フレームバッファに直接書き込むことはできますか? 私が知っているフラグメントシェーダーはフレームバッファーに書き込むことができますが、私の情報は補間され、どの位置に何を書き込むかがわかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.