問題タブ [opengl-3]
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.
opengl - OpenGLVAOのベストプラクティス
VAOに依存していると思われる問題に直面していますが、よくわかりません。
VAOの正しい使用法についてはよくわかりませんが、GLの初期化中に行っていたのは単純なことでした
続いて
その後、描画パイプラインで、最初にバインドされたVAOを気にせずに、glBindBuffer()、glVertexAttribPointer()、glEnableVertexAttribArray()などを呼び出しました。
これは正しい習慣ですか?
opengl - プログラム パイプライン シェーダーの変数交換
vec4 と float を頂点シェーダーからジオメトリ シェーダー、さらにフラグメント シェーダーに渡す必要があります。3 つのシェーダーは、均一性を維持するために 3 つの異なるプログラムに属し、必要に応じてジオメトリ シェーダーがアタッチ/デタッチされた単一のプログラム パイプラインに 3 つが集められます。
GL_ARB_separate_shader_object 拡張機能は次のように述べています。
GLSL には、さまざまな出力変数を後続のシェーダーのさまざまな入力変数に接続するための「名前によるランデブー」モデルがあります。個別のシェーダーでは、前のシェーダーが特定のユーザー定義の入力可変変数を書き込むかどうかは保証されません。HLSL9、Cg、および OpenGL アセンブリ拡張プログラムは、この状況を「API リソースによるランデブー」モデルで処理します。GLSL の用語では、これは個別の GLSL シェーダーが、ユーザー定義の可変変数ではなく、組み込みの可変変数によって通信する/必要がある/通信することを意味します。
頂点シェーダーとジオメトリ シェーダーでは、vec4 に gl_FrontColor を使用し、float に gl_FogFragCoord を使用し、gl_FogFragCoord と gl_Color を介してフラグメントでそれらを読み取りました。
それはうまく動作します..しかし..つまり..cmon、本当に?
このすべての背後にある理論的根拠は理解できますが、それは本当にくだらない回避策のように思えます。すべてが同じプログラム パイプラインで動作する場合、異なるプログラムの異なるシェーダーが互いに通信するようにする他の方法はありませんか?
opengl - パイプライン プログラム内のシェーダー間の in/out 変数
現在、3 つの異なるシェーダー (Vertex、Geometry、Fragment) を使用しています。それぞれが異なるプログラムに属し、すべて単一のプログラム パイプラインに集められています。
問題は、Geometry と Fragment の変数がゼロになっていることです。つまり、パイプラインの前のシェーダーによって以前に書き込まれた値が含まれていません。
各シェーダーについて:
各プログラム:
それから:
glドローで:
頂点シェーダー:
ジオメトリ シェーダ:
フラグメント シェーダー:
プログラム パイプラインのさまざまなステージ間で変化する書き込み/読み取りの重要なステップを見逃していますか?
アップデート:
GLSL仕様に次のように記載されているため、全員が同じベクトルで「話している」ことを確認するために、レイアウトの場所の修飾子を試しました。
layout-qualifier-id location = integer-constant 引数は 1 つだけ受け入れられます。たとえば、vec4 normal; の layout(location = 3) です。シェーダ入力法線がベクトル位置番号 3 に割り当てられることを確立します。頂点シェーダ入力の場合、位置は、入力値が取得される汎用頂点属性の番号を指定します。他のすべてのシェーダー タイプの入力の場合、場所は、そのシェーダーが別のプログラム オブジェクトにある場合でも、前のシェーダー ステージからの出力と照合するために使用できるベクトル番号を指定します。
しかし追加
コンパイルしない
だから私は glBindAttribLocation() を介して同じことをしようとしましたが、エラーは発生しませんが、動作はまだ変更されていません
更新 2
「#extension GL_ARB_separate_shader_objects: enable」を追加すると
次に、layout(location = n) in/out var; を使用できます。そして、それは機能します。
見つかった:
これは興味深い.. #version 330 を宣言すると、たとえ拡張機能を有効にしたとしても、レイアウトアウト修飾子を使用できないはずです.. ..しかし、拡張機能は次のように述べています:
この ARB 拡張機能は、GLSL 言語のレイアウト修飾子の使用を拡張して、クロスステージ インターフェイスを提供します。
glBindAttribLocation() を使用したり、単純な名前の一致 + ARB 拡張機能を有効にしただけでは機能しない理由を知りたいです!
opengl - 最新のゲームで OpenGL 3.2 をターゲットにすることは合理的ですか?
私は現在、レンダリングに OpenGL を使用するゲーム/エンジンに取り組んでおり、最近、固定機能パイプラインのサポートを段階的に廃止し始めました。2.1 をターゲットにすることもできますが、テッセレーションまたはジオメトリ シェーダーと、2.1 には存在しないさまざまな新しい GLSL 機能を使用したいと考えています。
ゲームが少なくともあと 1 年はリリースされる準備ができていないことを考えると、最小ベースとして 3.2 をターゲットにすることは合理的でしょうか?
このゲームは遅延照明用の MRT フレームバッファなどの新しい機能を利用していることに注意してください。固定機能のハードウェアをサポートするつもりはまったくありません。つまり、2.1 か 3.2 のどちらかで、私は 3.2 に傾いています。3.2 互換カードを持っている人の数と、それらが採用されている割合の大まかな数字を知っている人はいますか?
opengl - VAO と要素配列バッファーの状態
私は最近、Vertex Array Objects (VAO) を使用して OpenGL 3.3 コードをいくつか書いていて、後で Intel グラフィックス アダプターでテストしましたが、残念なことに、要素配列バッファー バインディングは明らかに VAO 状態の一部ではないことがわかりました。
効果はありませんでしたが、
ジオメトリをレンダリングしました。私はそれが OpenGL の Intel 実装の単なるバグだと思っていました (GL_ARB_vertex_array_object (および GL_OES_vertex_array_object でさえも) 要素配列は保存された状態の一部であることが明確に述べられているため) が、モバイル NVIDIA Quadro 4200 で発生しました。 .
ドライバーのバグですか、仕様のバグですか、それともコードのどこかにバグがありますか? コードは GeForce 260 および 480 で問題なく動作します。
似たような経験をした人はいますか?
また、GL_EXT_direct_state_access には、要素配列バッファーを VAO にバインドする関数がないことも奇妙です (ただし、頂点属性配列、つまり配列バッファーを指定する関数はあります)。GPU メーカーは仕様を台無しにして、私たちをごまかしていますか、それとも何ですか?
編集:
ここでは必要ないと思ったので、最初はソース コードを表示するつもりはありませんでした。ただし、要求に応じて、問題を再現する最小限のテスト ケースを次に示します。
上記のコードは、赤、青、黒の 3 つのクワッドを含む頂点バッファーを作成します。次に、個々のクワッドを指す 3 つのインデックス バッファーを作成します。次に、2 つの VAO が作成され、設定されます。1 つには赤いクワッド インデックスが含まれ、もう 1 つには青いクワッド インデックスが含まれます。黒のクワッドはまったくレンダリングしないでください (BIND_BLACK_QUAD_ELEMENT_ARRAY_BUFFERが定義されていると仮定します)。
これにより、ビューポートがクリアされて灰色になり、青または赤の四角形が繰り返しレンダリングされます (どちらも印刷されます)。これはデスクトップ GPU では機能しますが、ノートブック GPU では機能しません (VAO_DOESNT_STORE_ELEMENT_ARRAY_BUFFER マクロが定義されていない限り、黒いクワッドがレンダリングされます。BIND_BLACK_QUAD_ELEMENT_ARRAY_BUFFER マクロを未定義にすると、青色のインデックス バッファーが最後にバインドされるため、クワッドが青色になります。しかし、そうではありません。何があっても赤いクワッドをレンダリングします。
私の見方では、これは、VAO がどのように機能するかについての私の理解における致命的な誤解、コードのバグ、またはドライバーのバグのいずれかです。
c++ - GLFW3.2をデプロイできません
つまり、これはドゥージーです。
Windows7のGLSL1.5を使用してバージョン3.2コアで記述された、かなり大規模なOpenGLソリューションがあります。ヘルパーライブラリとしてGLEWとGLMを使用しています。ウィンドウを作成するときは、次の行を使用しています。
3つのglfwOpenWindowHint関数を省略すると、アプリケーションはglDrawArrays(GL_TRIANGLES、0、m_numIndices);を呼び出すとビデオドライバーをクラッシュさせます。
しかし、ここにキッカーがあります。私のグループの他の誰かがソリューションを更新して実行しようとすると、ジオメトリのない空白のウィンドウが表示されます。3行をコメントアウトすると、プログラムは正常に実行されます。3.2coreヒントを使用する場合と使用しない場合では、かなり均等に分割されます。nVidia、AMD、デスクトップ、またはラップトップの違いを特定できませんでした。
私が見つけた最高のものは、glewExperimental=GL_TRUEを追加する提案でした。グリューはコアに問題があると言われています。違いはありませんでした。ソリューションは大きすぎてコードを投稿できませんが、必要に応じてシェーダーやレンダリングコードなどを配置できます。
本当にありがとう!これは私たちを数日間殺してきました。
macos - OSXで利用可能なOpenGLARB拡張機能
http://developer.apple.com/graphicsimaging/opengl/capabilities/GLInfo_1072_Core.htmlから、現在のOSX10.7.2コアOpenGLサポートはGLSL1.50で3.20に制限されているようです。
他のデータの中には、利用可能なARB_拡張機能があります。
私は、これらが現在の拡張機能であることが保証されている最低限のものなのか、それとも実際にこれら4つしかないのか、つまり次のことを考えていました。
現在、OSXで実行する必要があり、ARB_separate_shader_objectsを使用するポータブルアプリケーションを開発していますが、OSX 10.7.2では確実に実行されないということですか?
opengl - glDrawElements の使用時に OpenGL コア プロファイルで三角形を選択する
glDrawElements を使用して三角形のメッシュを描画しており、マウス クリックを使用して三角形を選択/選択できるようにしたいと考えています。三角形のメッシュは非常に大きくなる可能性があります。
固定機能の OpenGL では、GL_SELECT を使用する可能性があります: http://content.gpwiki.org/index.php/OpenGL:Tutorials:Picking .. ただし、OpenGL コア プロファイルの使用にのみ関心があります。
別の可能性は、「カラーコーディング」を使用することです。
http://www.lighthouse3d.com/opengl/picking/index.php?color1
http://www.opengl.org/resources/faq/technical/selection.htm
..しかし、私が知る限り、glDrawElementsを使用する場合、三角形ごとの情報をまだ示すことはできませんか?
最後に、マウスの位置からピック レイを発射することで CPU ベースのピッキングを行うことができましたが、CPU で三角形を変換する必要があると思われるため、これは非常に遅くなるため、GPU ベースのソリューションを使用することをお勧めします。
OpenGL コア プロファイルで glDrawElements を使用する場合に最適な選択方法について誰か提案がありますか?
opengl - glDrawElementsInstanced の呼び出し時のセグメンテーション違反
glDrawElements を glDrawElementInstanced に変更すると、有効なプログラムで segfault が発生することがわかりました。コンパイルに問題はありません。gdb は、glDrawElementInstanced がセグメンテーション違反であると述べています。誰でも問題を推測できますか?
x86_64 GNU/Linux で実行されます。
CMakeLists.txt の一部:
セグメンテーションのサイト:
opengl - 異方性フィルタリングとマルチサンプリング
私はOpenGLSuperbible5thedを読んでいます。私は本で説明されているがまだ私にはそれほど明確ではないいくつかの用語に出くわしました。
1つ目はマルチサンプリングです。ポリゴンを滑らかにし、より良い画像をレンダリングするために使用されることを理解しています。私が理解していないのは、アンチエイリアシングとの違いです。
2つ目は異方性フィルタリングです。このタイプのテクスチャフィルタリングの効果は知っていますが、正確にいつどのように使用されるかを知りたいです。おそらくアルゴリズムの一般的な説明ですか?私はそれをグーグルで検索しましたが、ウィキペディアはあまり説明していません。