問題タブ [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.
opengl - glew が glDrawArraysInstancedBaseInstance をフェッチしない
glDrawArraysInstancedBaseInstanceを使用しようとしていますが、リンカーは __glewDrawArraysInstancedBaseInstance が解決されていないと不平を言います。
glew-1.9.0 がマシンにインストールされており、リンクしているはずです。
一時的な回避策として、機能する関数を自分でフェッチしているだけです。しかし、 glew がその機能に対して機能していないように見える理由を理解するのには役立ちません。
そして実際には glew は opengl 3.3+ に対しては機能していないようです
関数が使用可能であることを確認するには、 を使用しますglfwExtensionSupported("GL_ARB_base_instance")
。
明確にするために、これは GLFW 機能であり、GLEW の拡張チェッカーではありません。
glfw を使用してウィンドウと 4.3 コア プロファイル コンテキストを作成しています
私のシステム:
NVidia gtx 550 ti、最新のドライバー
Ubuntu 12.04
これをコンパイルするために、make ファイルと CMakeLists.txt に CMake を使用しています。
target_link_libraries(app GL GLU GLEW glfw)
c++ - OpenGL Programming Guild 第 8 版、サンプル プログラムおよび「NumVAO」
バージョン 2.1 の RedBook に取り組んだ後、私の以前の質問を見た人は誰でも、バージョン 4.3 に移行しています。(あなた方の多くが私にこれを行うように何年もの間言ってきたので、あなたは言います。)
ですから、私は第 3 章に深く入っていますが、第 1 章のサンプル プログラムはまだ機能していません。
2 つの問題があります。(実際には 3.) まず、コンパイルされません。それは問題ですが、次の 2 つを考えると、ちょっと関係ありません。第二に、それがどのように機能するか、または何をしようとしているのか正確にはわかりませんが、それについて説明します.
第三に、このコードの作成者は完全な魔術師であるように私には思えます。ここでは、あらゆる種類のいじくりハッキングが行われていることを示唆しています。これは、問題番号 2 が原因である可能性が最も高く、それが何をしようとしているのかわからないという事実です。もちろん、この本を書いた人たちはばかではありませんが、私に我慢して、例を挙げます。
ファイルの先頭から抜粋したコードのセクションを次に示しmain.cpp
ます。ファイルの残りの部分は後で含めますが、今のところは次のとおりです。
私が正しく理解していれば、列挙型はゼロベースであるため、これによりVAO_IDs::Triangles
の値が得られます。1
(ここで私が正しいことを願っています。そうしないと、恥ずかしい思いをすることになります。)
しばらくすると、次の行が表示されます。
GLuint
NumVAOs が 1 に等しいという事実により、1 つの Gluint を含む の配列を宣言しVAO_IDs::NumVAOs
ます。
そして第二に、一体なぜ列挙型がこのように使用されたのでしょうか? 明らかな理由で、そのような列挙型を使用することはありません-同じ値を持つ複数のデータを持つことはできません、値は明示的に指定されていません...
ここで正しい木を吠えていますか?これを行うのは意味がありません.VAOは、このようにグローバルであるべきでしたね。GLuint NumVAOs = 1;
これは、列挙型を乱用するだけです!
実際、ステートメントの下に表示されconst GLuint NumVertices = 6;
ます。必要に応じて値 6 を変更することはできますが、NumVAOs を 0 に変更することはできません。たとえば、Triangles は既に 0 に設定されているためです。
とにかく、列挙型のことは忘れてください...今のところ...わかりましたので、それで大したことをしました。それで問題は終わりです...これ以上のコメントは今コードにあります。glfw のほとんどは無視できます。本質的には glut と同じです。
非常に冗長な質問だと思いますが、簡単に「わからない」と言うのではなく、クレイジーなコードだと思う理由を説明することが重要だと思いました。これらの非常に賢い人々がなぜこのようにすることに決めたのか、なぜエラーがあるのか を誰か説明してもらえますか. (私はこれについてオンラインで何も見つけることができません。)
opengl - GLEW は何を行い、なぜ必要なのですか?
さて、GLEWが必要な理由はすでにわかっていますが、ある程度までです。
おそらくバージョン 3.0 以降の最新の OpenGL を使用している場合、および/または Core Profile を使用している場合、GLEW がないとコンパイルでglGenVertexArrays
宣言されていないなどのエラーが発生するため、GLEW が必要です。
したがって、GLEW は、おそらく使用したい最新の OpenGL 関数を含むバックグラウンド作業を少し行います。
それとは別に、それは他に何かしますか?また、どのように機能しますか。
たとえば、クロスプラットフォームのコンパイルは改善されますか? (たとえば、Linux から Windows または OS X に移行する場合、コードの変更は少なくて済みますか?
グラフィックハードウェアの「クロスプラットフォーム性」も改善されますか? たとえば、OS を含めて 2 台の同一のコンピューターがあったとします。プログラムは、1 つのシステムで OpenGL 4.3 コマンドを使用してコンパイルされます。他のシステムに OpenGL 3.3 のみをサポートするグラフィックス カードまたはドライバーがある場合、GLEW はそれを支援しますか? (おそらく、古いバージョンの OpenGL 用にシェーダーをコンパイルしていますか?)
したがって、GLEW が何をどのように行うのか、私が実際には知らないことがわかると思います。
最後にもう 1 つ。GLFWでGLEWを使用する方法を知っている人はいますか? 実際には別の質問として投稿するかもしれません。
opengl - プログラムでミリオンメッシュ?
単一のフルスクリーンで描かれた平らな面がありGL_QUAD
ます。
GL_Texture2D
できれば何らかのシェーダーを使用して、 my で指定された各ポイントでこのサーフェスを変形したいと考えています。
私の考えでは、黒はフラットに対応し、白は丘に対応する可能性があります.
地形に約 400 万点を配置し、プログラムの各ステップでそれらを更新したいと考えています。
これを行うには、ジオメトリ シェーダーをどのように使用すればよいですか? シェーダーは新しい頂点を生成できますか?
c++ - OpenGL 4 ヘッダー
C/C++ 用の OpenGL 4.0 ヘッダーはどこからダウンロードできますか? でしか見つかりませんでしGL/gl.h
た/compiler/include/
が、時代遅れです (OpenGL 1.1)。
GLEW のようなライブラリを提供しないでください。純粋な OpenGL でアプリケーションを作成したいと考えています。
opengl - ドライバーでサポートされていない上位バージョンの OpenGL の定数を使用しても安全ですか?
たとえば、GL_LUMINANCE_ALPHA を使用して 2 つのコンポーネント データをテクスチャに転送しています。GL_LUMINACE_ALPHA のような一部の内部フォーマット定数は OpenGL 3.0 (おそらく 4.0?) 以降では廃止されているので、GL_RG や GL_RG8 などを使用してください。
しかし、ターゲットの OpenGL バージョンは 2.0 以降であり、OpenGL 2.0 の仕様には GL_RG/GL_RG8 が含まれていません。この場合、次の 3 つの可能性があると思います。
- OpenGL 2.0 のみをサポートするデバイスでもプログラムが正常に動作する場合は、GL_RG/GL_RG8 を使用してください。
- OpenGL のバージョンが非常に高いため、古い定数が非推奨になっているデバイスでプログラムが適切に実行できる場合は、古い定数を保持してください。
- 実行時に OpenGL のバージョンを検出し、各バージョンの定数を切り替えます。
何を選べばいいですか?3. を取りたくないのは、物事が難しく複雑になるからです。
c++ - OpenGL 4.2 glBindAttribLocation 無効な値?
OpenGL 4.2 を使用していますが、このプログラムで GL_INVALID_VALUE エラーが発生する理由がわかりません。glBindAttribLocation を呼び出すとエラーが発生します。OpenGL 4 リファレンス ページによると、GL_INVALID_VALUE を glBindAttribLocation から生成する必要がある理由は 2 つしかありません。
void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- インデックスが MAX_VERTEX_ATTRIBS 以上の場合、INVALID_VALUE が生成されます。
- program が OpenGL によって生成された値でない場合、INVALID_VALUE が生成されます。
以下のプログラムからわかるように、index
is20
とGL_MAX_VERTEX_ATTRIBS
isであるため、条件 1 は設定されません34921
。program
は を使用して OpenGL によって生成されるため、条件 2 は満たされていませんglCreateProgram()
。では、どうすればエラーが発生する可能性がありGL_INVALID_VALUE
ますか?
端末出力
また、OpenGL 4.2 を確認するには
注:参考ページによる。「glBindAttribLocation は、頂点シェーダー オブジェクトが指定されたプログラム オブジェクトにバインドされる前に呼び出すことができます。汎用属性インデックスを、頂点シェーダーで決して使用されない属性変数名にバインドすることも許可されています。」したがって、シェーダーがロードされてDoesNotExist
おらず、存在しないという事実は問題ではありません。
opengl - GLSL 4.2 - 構文エラー:「レイアウト」解析エラー
というわけで、最近面白いシェーダーを見つけたのでコンパイルしてみました。
しかし、GLSL コンパイラは次のエラーをスローしました。
@ (フラグメント シェーダー)
詳細:
- カード:AMD Radeon HD 7870(OpenGL 4.20対応)
- 4.2 ドライバーと 4.3 ベータ ドライバーの両方を試しました。
c - glShaderStorageBindingを使用してシェーダーバッファブロックをバインドする方法は?
OpenGL 4.3 を使用して、シェーダー バッファー ブロックをバインドする方法を知りたいですglShaderStorageBinding
。
「バインディング」修飾子は正常に機能しますが、使用したくありません。
私は次のコードを書きました:
計算シェーダー:
結果は 1 であると予想されますが、Obuffer では値が 0 として返されます。