問題タブ [opengl-4]
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.
macos - OSX での OpenGL 4.1 コンテキストの読み込み
今日の時点でOpenGL 4.1までをサポートするOSX MavericksでOpenGLを学ぼうとしています。
私はそれを基本的に保ち、gcc (g++) を使用してコンパイルしていますが、Freeglut OSX を介してオープン GL コンテキストをロードすると、レガシー OpenGL プロファイルがロードされます。
私はこれを試しました: FreeGLUT を使用した OSX 上の OpenGL 3.3 ですが、運が悪かったため、glGetString 呼び出しは次の値を返します。
誰にもアイデアはありますか?
次のコンテキスト呼び出しで FreeGlut を呼び出しています。
編集:OSXではなくWindowsで同じアプリケーションを試してみたところ、次のエラーが発生しました:
2.1 コンテキストが要求されましたが、wglCreateContextAttribsARB は利用できません。従来のコンテキスト作成にフォールバックする
これが私のアプリケーションエントリポイントです
わかりました。
Windows PC で再コンパイルしましたが、問題はありませんでした。おそらく、OSX または OSX 自体、またはその組み合わせでの FreeGLUT の問題です。
少なくとも今は、OSX をテストできるコードを持っています...
opengl - どのシェーダー ステージが gl_ClipDistance[x] を書き込む必要があるか
フラグメント シェーダーを除くすべてのシェーダーで出力変数として使用できます。では、どのシェーダー ステージでそれを書き込む必要があるのでしょうか? その値は、それを書き込んだ最後のシェーダー ステージから取得されますか?
また、フラグメントシェーダーで値 gl_ClipDistance を持つ目的は何ですか?
c++ - OpenGL 4.0 でローカル座標を中心に (つまり、モデルビュー マトリックスから) 回転する標準的な方法はありますか?
私はゲーム エンジンに取り組んできましたが、最近、ビュー マトリックスを管理するための Camera クラスを簡単に作成できるようになりました (または別のエンジンに簡単に切り替えることができます)。私はそれが何をしなければならないかを概念的に知っていますが、私が問題を抱えているのは、ローカル原点を中心に回転する方法を理解することです(ビューマトリックスの場合、回転マトリックスに乗算される変換マトリックスと同じになります)。
ダイレクトモードでは、
しかし、それがより現代的なアプリケーションにどのように変換されるかはわかりません。基本的に同じことを行い、平行移動行列を原点に戻し、回転させ、逆方向に移動しますか? 回転させたいオブジェクトごとに?これまでにテストしたことから、その方法は表示には機能しますが、3D 空間でそれを制御するのは扱いにくいです (回転を常に調整する方法がわかりません。動きのコンポーネントを単一の vec4 に変換し、回転を乗算し、平行移動に適用してから、実際の回転を行いますか?)
私が見逃している4x4行列の乗算を3つ以上行うよりも効率的な方法があるようです。
提案された解決策を試した後の特定のセクションは次のとおりです。
c++ - プログラムで sefault を引き起こす GLSL 統一アクセス
遅延レンダリングを使用してプログラムをセットアップしました。深さから位置を再構築するために、位置テクスチャを削除しています。以前は問題なくこれを実行しましたが、ユニフォームを介して渡すマトリックスにアクセスしようとすると、何らかの理由でセグメンテーション違反が発生します!
私のフラグメントシェーダー(頂点シェーダーは無関係):
ご覧のとおり、この segfault の原因となっているコードがreconstruct_pos()
関数に示されています。
なぜこれがセグメンテーション違反を引き起こしているのですか? アプリケーション内のデータを確認しましたが、正しいです。
編集:
マトリックスのユニフォームを更新するために使用するコード:
glsl - シングル ステージ (フラグメント シェーダー)、シングルパス シナリオでの GLSL コヒーレント imageBuffer アクセス
イメージのロード/ストア操作を使用して imageBuffer で処理を実行する単一のフラグメント シェーダーがあります。私は次のシナリオについてのみ懸念しています。
- 私は単一のフラグメント シェーダーを持っています (マルチステージ (例: 頂点シェーダーとフラグメント シェーダー) の考慮事項はなく、マルチパス レンダリングもありません)。
- imageBuffer 変数はコヒーレントとして宣言されます。コヒーレントな imageBuffers にのみ関心があります。
物事を完全に明確にするために、私のシナリオは次のとおりです。
私は主に仕様を見てきました
特にこの段落:
「「コヒーレント」として宣言された変数を使用すると、ストアの結果が、同様に宣言された変数を使用してシェーダー呼び出しにすぐに表示されることが保証されます。ストアが他の操作に確実に表示されるようにするには、MemoryBarrier を呼び出す必要があります。」
注:私の「一貫した均一なimageBufferデータ;」宣言は正確には「同様に宣言された」変数です。私のシナリオは、シングルパス、シングル ステージ (フラグメント シェーダー) です。
今、私はさまざまな Web サイトを見て、(私が思うほとんどの人のように) stackoverflow.com の次のスレッドに出くわしました。
GLSL の「コヒーレント」メモリ修飾子は、マルチパス レンダリングのために GPU ドライバによってどの程度正確に解釈されますか?
より具体的には、この段落:
「あなたのシェーダーは、ストアの直後にロードを発行すると、まさにこのシェーダーに保存されたばかりのメモリが取得されるという仮定さえできません (そうです。それを引き出すには、memoryBarrier を配置する必要があります)。」
私の質問は次のとおりです。
私の単一シェーダー、単一パス処理シナリオで指定されたコヒーレント修飾子を使用して、imageStore() がフラグメント シェーダーのすべての呼び出し (たとえば、現在の呼び出しも同様) にすぐに表示されることを確認できますか?他の同時呼び出しとして)?
ARB_shader_image_load_store 仕様を読むと、次のように思えます。
- この質問への答えはイエスです。
- 私はどんな種類のmemoryBarrier()も必要としません。
- 上記のスタックオーバーフローのスレッドで引用された文は、実際には誤解を招き、間違っている可能性があります。
あなたの洞察に感謝します。
opengl - gl_PrimitiveID は Tessellation Control および Evaluation シェーダーでどのように解釈されますか?
OpenGL 仕様。言います:
変数
gl_PrimitiveID
には、入力頂点を生成した描画コマンドによって処理されたプリミティブの数が入ります。描画コマンドによって生成された最初のプリミティブには 0 の番号が付けられ、プリミティブ ID カウンターは、個々のポイント、ライン、またはトライアングル プリミティブが処理されるたびにインクリメントされます。プリミティブ再起動インデックスを使用してプリミティブ トポロジを再起動しても、プリミティブ ID カウンターには影響しません。
残念ながら、私にはそれがよくわかりません。
GL_PATCHES
頂点数 = 32で描画呼び出しを行う場合、Tesselation Control シェーダーで32個の頂点すべてがgl_PrimitiveID
= 0になりますか?
テッセレーション コントロール シェーダは引き続きパッチを出力し、パッチは単一のプリミティブです。
このパッチが Tessellation Evaluation シェーダーで三角形としてテッセレーションされる場合、n番目の頂点ごとにgl_PrimitiveID
= n / 3になると仮定するのは正しいですか?
そうでない場合は、それらの値がどうなるかを説明してください。