問題タブ [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 - glVertexAttribPointer の奇妙な動作
デフォルトの VAO と 1 つの VBO を作成し、それらをバインドします。モデル データを構造体 vertex_data_t の配列にロードしています
次に、描画関数で次のことを行います。
私は元気になってきました、日陰のスザンヌ:
http://i.stack.imgur.com/uRjpv.png
しかし、これは間違っています!通常の属性の glVertexAttribPointer の最後の引数は 12 aka (const GLvoid *)offsetof(vertex_data_t, normal)である必要がありますが、そうするとスザンヌが壊れます:
http://i.stack.imgur.com/zBjTS.png
それはどのように可能ですか?シェーダーは法線へのオフセットをどのように認識しますか?
頂点シェーダー:
opengl - gl_PrimitiveIDをカスタムフレームバッファオブジェクト(FBO)に出力する際の問題
定義したフラグメントバッファオブジェクト(FBO)に「gl_PrimitiveID」を出力したい非常に基本的なフラグメントシェーダーがあります。以下は私のフラグメントシェーダーです:
FBOを次のように設定します。
何らかの理由で、glReadPixelsは「GL_INVALID_OPERATION」エラーを表示しますか?ただし、renderbufId1の内部形式を「GL_RGB32UI」から「GL_RGB」に変更し、glReadPixelsで「GL_UNSIGNED_INT」の代わりに「GL_FLOAT」を使用すると、すべてが正常に機能します。'GL_INVALID_OPERATION'エラーが発生する理由と、それを解決する方法を知っている人はいますか?
'gl_PrimitiveID'を出力する別の方法はありますか?
PS:このように「gl_PrimitiveID」を出力したい理由はここで説明されています:glDrawElementsを使用するときにOpenGLコアプロファイルで三角形を選択する
opengl - 16 ビット テクスチャを作成するときの「無効な列挙型」
テレイン パッチの高さマップを保持する 16 ビット テクスチャを作成しようとしていますが、次の両方で「無効な列挙型」エラーが返されます。CHECK_GL_ERROR() マクロは、gluErrorString をメッセージとして表示し、glGetError が GL_NO_ERROR 以外の何かを返す場合は中断します。
GL_TEXTURE_2D ターゲットにバインドされたテクスチャを作成しましたが、次のエラーがあってもなくても同じエラーが発生します。
GTX 560Ti で OpenGL 3.2 コンテキスト、NVIDIA CUDA dev ドライバー 286.16 を使用しています。誰かが私が間違っていることを見ることができますか?
乾杯
c++ - 画面・ガラス割エフェクト
OpenGL(シェーダーあり)を使った画面遷移で、そのようなことをしたいです。チュートリアルなどを探していましたが、何の効果もありませんでした。どうすればその効果を達成できますか?
c++ - 非推奨の OpenGL 関数をコードで明示的に無効にすることはできますか?
私は最近、OpenGL の新しい実装を使用するコードを書き始めました。ただし、新しい OpenGL 実装では、多くの古い関数が非推奨と見なされていることに気付きました。適切な機能のみを使用したい場合、それらを無効にする方法はありますか?
c++ - glVertexAttribPointer の問題 (OpenGL 3.x 前方互換コンテキスト)
現代の基準では、ポリゴン メッシュをレンダリングする好ましい方法は、インデックス バッファー (最終的には への呼び出しによって描画される) と組み合わせた頂点バッファー オブジェクトの使用を伴うようですglDrawElements()
。これがまさに、私がこれらの概念に頭を悩ませようとしている理由です。また、非推奨などglVertexAttribPointer()
の代わりに使用することを主張します。 glVertexPointer()
glNormalPointer()
カスタムのバイナリ3D ファイル形式 (Wavefront .OBJ の派生物) を使用しています。その内容は多かれ少なかれ直接memcpy()
頂点配列に変換できます。vertex
構造を宣言した方法は次のとおりです。
この関数はインデックス バッファ(s の単純な配列として実装) をloadBObj()
返し、関連付けられた頂点/法線データで頂点配列を埋めます (使用されるすべてのモデルは、よりスムーズなシェーディング結果のために頂点ごとの法線を持つようにエクスポートされています)。 .unsigned short int
ローディング コード自体は、適切に動作することが検証されています。
現在、次のようloadBObj()
に新しい VBO が作成されています。
loadBObj()
が呼び出された後、次のようにインデックス バッファ オブジェクト(おそらくそのように参照されるべきではありません) が作成されます。
わかった。実際にメッシュをレンダリングするときは、次のコードを使用しました。
これにより、完全に正しいジオメトリが得られますが、シェーディングは完全には正しくありません。
- 即時モードでレンダリングされたモデルのイメージを次に示します。
img http://i44.tinypic.com/i36zcg.png
- 上記のプログラムによって作成されたものを次に示します。
VBO の処理で何かおかしなことはありますか?
opengl - GLSL OpenGL 3.xジェネリック頂点属性インデックスとセマンティクス間のマッピングを指定する方法は?
HLSL から GLSL に切り替えています
頂点バッファの頂点属性を定義するときは、呼び出す必要があります
インデックスを渡します。しかし、シェーダーでどのインデックスがどのセマンティックにマップされるかを指定するにはどうすればよいでしょうか?
たとえばgl_Normal
。頂点シェーダーで使用する場合、これをインデックス 1 のジェネリック頂点属性にするように指定するにはどうすればよいgl_Normal
ですか?
d - D 言語で OpenGL 3 を使用して単純な四角形をレンダリングする
画面に単純な三角形のセットを表示することができないので、気が狂いそうです。
Dプログラミング言語の遺棄されたバインディングを使用して、OpenGL3(非推奨の固定パイプラインなし)を使用しています。
次のプログラムのエラーを見つけられますか? それは問題なくコンパイルされ、OpenGL/GLSL エラーはスローされません。設定したクリアカラーの空白の画面が表示されるだけです。
c - OpenGL レンダリング コンテキスト 「失敗した要求 152 (GLX) のオペコード」を生成します (Mesa 8.0 - OpenGL 3.0、Linux)
これは大きな問題です。最初に、私は XLib API について少し知っていますが、何かを行う前に実際に OpenGL レンダリング コンテキスト (3.0) を作成できることをテストして確認したかったので、コピーして貼り付けましたいくつかのテストコードを実行しました。
コードを実行すると、出力は次のようになります。
さらに、後続のglxinfo
プロデュースの呼び出し
この仕様によると、私の可能性は機能するはずです-正しいですか? そうでない場合、これを変更するために私にできることはありますか? このような問題があることについて私が読んだフォーラムの投稿は、通常、コンテキストを初期化しようとするときに OpenGL 3.x の適切な実装を欠いている人々によるものであり、その結果、私がテストしたコードと同様の出力が得られます。 .
また、自分のディストリビューション用のさまざまな X11 パッケージを検索して、偶然何かが欠けているかどうかを確認しました。もちろん、これは無駄でした。インストール/変更を行った結果、事態が悪化したか、単に機能しなかったからです。
xorg.conf
実行コード
これがどのように起こっているのか、私はかなり困惑しています。誰かがこの問題に対する洞察や解決策を提供してもらえますか?
c++ - OpenGL 3.3 アプリケーションが何も描画しないのはなぜですか?
OpenGL VAO/VBO のハンドルを取得しようとしていますが、概念的にはそこにいますが、何らかの理由で、このアプリケーションは画面に何も描画していません。私は 4.2 のコンテキストで作業していますが、コアのみの 3.3 について書いています。
関連する変数の宣言は次のとおりです。
と呼ばれる関数init_scene
には、次のものがあります。
そして私のGLSLプログラムがリンクされている場所:
使用する属性は 1 つだけです。それが頂点の位置です。プログラムはエラーなしでリンクします。
draw_scene
関数自体は次のとおりです。
そして、良い尺度として、私の頂点シェーダーは次のとおりです。
modelview_matrix
は、当面は恒等行列を渡すだけのユニフォームです。単純に見えない何かが描かれているのではないかと一瞬思ったので、クリア カラーをグレーに設定しました。これが、白を出力するフラグメント シェーダーです。
私が読んだすべてのもの、特にこのチュートリアルと Superbible は、一連の出来事を非常に明確にしています。
- VAO を作成する
- VAO をバインドする
- VBO を作成する
- VBO をバインドして埋める
- 属性ポインタを設定する
glDEBugger を使用して、これが機能しない理由をより明確に把握しようとしました。私は GL エラー セットでブレークを設定しているので、GL 関数自体によってエラーが発生していないことがわかっています。VBO の内容を見ることができます。これは期待される頂点データです。私が確信していない唯一のことは、VBO が頂点位置データとして VAO に関連付けられていること、および描画関数を呼び出すときに VAO が実際に正しくバインドされていることを確認する方法です。
必要なもので省略したものがあれば、お知らせください。ありがとう!
更新 1:
以下は、VBO にロードされた頂点データを提供する配列です。
私のすべてのコンテキスト設定は次のようになります。
更新 2:
以下のニコル・ボーラスの回答は、私が考えていなかった正投影の可視性についての良い点をもたらしました。残念ながら、それが問題ではないようです。私は彼の頂点リストを試し、カリングをオフにして、これらの頂点を試しました。
どちらが正方形を描くべきだと思いますが、それでも何もありません。glDrawArrays
また、4 つの要素 (12 の座標 = 4 つの x、y、z 頂点) である必要があるときに 12 の要素で呼び出していることにも気付きましたが、これでも問題は解決しませんでした。
更新 3 (または「投稿が長すぎる場合」):
gDEBugger でアプリケーションを順を追って見ていくと、奇妙な点に気付きました。このdraw
関数には、現在の VAO をバインドし、 を呼び出しglDrawArrays
、VAO 0 をバインドして、別のものを描画できるようにするという通常のサイクルがあります。これが発生したときに GL 状態設定を監視すると、VAO がバインドされていない (つまり、VAO 0 がバインドされている)ときと、VAO がバインドされているときのように見えますGL_VERTEX_ARRAY
。これが本来あるべき姿ですか?それによって増強されるのではなく、それに取って代わられる状態を表していますか? さらに、モードを からに変更して設定します。TRUE
FALSE
GL_VERTEX_ARRAY
glBindVertexArray
GL_TRIANGLE_STRIP
GL_POINTS
glPointSize(5.0f)
単一のポイントが 0, 0 に描画されるため、ポイントが作成されているように見えますが、頂点シェーダーによって適切に処理されていません。