問題タブ [glsl]
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 - GLSL でディレクショナル ライトをカメラ空間に変換する方法
照明用に次の GLSL コードがあります。
ライト ベクトルはワールド空間で指定されます。を使用してカメラの向きと位置を設定しgluLookAt
ます。OpenGL はライト ベクトルがカメラ空間にあると想定するため、ライトは固定方向にとどまるのではなく、カメラと共に移動します。
を呼び出す前と後に、シェーダーをアクティブにしてライト ベクトルを設定してみましたgluLookAt
が、同じ効果が得られます。光ベクトルを適切に変換するには、正確に何をしなければなりませんか?
python - pygtkglext を使用したシェーダー
glsl シェーダーを gtk-opengl ウィンドウで動作させる方法を知っている人はいますか? glut allglCreateProgram
などの関数は機能しますが、同じ gl コードを pygtkglext ウィンドウに入れようとすると、NullReference について不平を言います:
だから I from OpenGL.GL.ARB.shader_objects import *
、しかし結果は似ています:
どんなアイデアも役に立ちます。
opengl - コンパイル済みシェーダー(GLSL)をリンクできません
シェーダーをロードしてプログラムで使用できる小さなクラスがあります。シェーダーをコンパイルすることはできますが、それらをリンクするときは、リンクしたくありません。glGetProgramInfoLogを使用して、次のエラーログを取得しました。コンパイルが正常に機能したため、プログラムが定義されていないことがなぜ表示されるのかわかりません...
以下のコードは、GLSLリンクを実行します。
Vertex_とfragment_は頂点とフラグメントのシェーダーであり、program_はProgramObjectARBです。
これを実行するために必要な変更を知りたいのですが。
バーテックスシェーダー:
フラグメントシェーダー:
編集-解決策 ソースファイルを読み取るために使用した方法が正しくなかったようです。シェーダーはコンパイルされますが、リンク時に正しく機能していませんでした。今、私はこのメソッドを使用してファイルを読み取り、リンクは正しいです:
java - GLSL での 32 ビット RGBA 浮動小数点値の読み取り
32 ビットの float データをシェーダーに送信しようとしていますが、結果が不安定です。完全な白 (1,1,1,1) でテストすると、値はすべてゼロになります。これはテクスチャを作成するための私のコードです:
そしてGLSLでそれを読む:
テクスチャをランダムな値に設定すると、何かが表示されますが、正しくありません。これは RGBA32F テクスチャから読み取る正しい方法ですか、それとも何か不足していますか?
optimization - 法線の GLSL シェーダ生成
こんにちは、私は 3D モデリング アプリを作成しており、OpenGL でのレンダリングを高速化したいと考えています。現在、私は glBegin/glEnd を使用していますが、これは非常に遅く非推奨の方法です。非常に高速なフラット シェーディング モデルを描画する必要があります。フレームごとに CPU で法線を生成します。これは非常に遅いです。インデックス付きジオメトリで glDrawElements を使用しようとしましたが、法線が三角形レベルではなく頂点で指定されているため、法線生成に問題があります。
もう 1 つのアイデアは、GLSL を使用してジオメトリ シェーダーの GPU で法線を生成することでした。通常の生成用にこのコードを書きました:
シェーダーをアプリケーションに統合しても、速度は向上しませんでした。以前よりもひどかった。私はGLSLとシェーダー全般の初心者なので、何が間違っていたのかわかりません。Geforce 9400M を搭載した MacBook でこのコードを試しました。
より明確にするために、これは私が置き換えたいコードです:
ご覧のとおり、非常に非効率的ですが、機能しています。triangles
配列へのインデックスのvertices
配列です。
このコードを描画に使用しようとしましたが、2 つではなく 1 つのインデックス配列 (頂点用に 1 つ、法線用に 2 つ目) を持つことはできません。
さて、いくつかの頂点が異なる三角形によって共有されているため、それらの法線が異なる場合、法線へのポインタを指定するにはどうすればよいですか?
opengl - CocoaとOpenGL、配列を使用してGLSL頂点属性を設定するにはどうすればよいですか?
私はOpenGLにかなり慣れていないので、いくつかの問題が発生しているようです。GLSLで単純なシェーダーを作成しました。これは、指定されたジョイントマトリックスによって頂点を変換し、単純なスケルタルアニメーションを可能にすることになっています。各頂点には、最大2つのボーンインフルエンス(Vec2のxおよびyコンポーネントとして格納)、変換行列の配列に関連付けられたインデックスおよび対応する重みがあり、シェーダーで「属性変数」として指定され、設定されます。 「glVertexAttribPointer」関数を使用します。
ここで問題が発生します...行列の「UniformVariable」配列を適切に設定できました。シェーダーでこれらの値を確認すると、すべてが正しくインポートされ、正しいデータが含まれています。ただし、ジョイントインデックス変数を設定しようとすると、頂点に任意の変換行列が乗算されます。これらは、空間内のランダムな位置(毎回異なる)にジャンプします。これは、インデックスが正しく設定されておらず、シェーダーがジョイントマトリックス配列の終わりを超えて次のメモリに読み取っていると想定しています。理由はよくわかりません。このテーマについて見つけたすべての情報を読んだときに、同じ(あまり似ていない場合でも)コードが例に含まれているのを見て驚いたのですが、それはうまくいったようです。
私はかなり前からこの問題を解決しようとしましたが、本当に神経質になり始めています...行列が正しいことはわかっています。シェーダーのインデックス値を手動で任意の整数に変更すると、次のようになります。正しい行列値と正常に機能し、すべての頂点をその行列で変換しますが、作成したコードを使用して属性変数を設定しようとすると、機能しないようです。
変数を設定するために使用しているコードは次のとおりです...
そして、私の頂点シェーダーは次のようになります...
これは本当に私を苛立たせ始めています、そしてどんなそしてすべての助けも感謝されるでしょう、
-アンドリュー・ゴトウ
c++ - Visual Studio の外部で OpenGL プログラムを実行できないのはなぜですか?
私は GLSL を使用する OpenGL プログラムを持っています。これは、Visual Studio (2008) の [再生] ボタンで問題なく実行できます。標準のリリース構成とデバッグ構成の両方で。
ただし、エクスプローラーから実行可能ファイルを実行しようとすると、何かの読み込みに失敗したことを示すテキストのない点滅する cmd プロンプトだけが表示されます。
必要な DLL ファイル (glut32.dll、glew.dll など) を実行可能ファイルと同じフォルダーにコピーしようとしましたが、違いはありませんでした。また、GLSL ファイルを同じフォルダーにコピーしようとしましたが、それも役に立ちませんでした。
Visual Studio なしでプログラムを実行するには、どうすればよいですか?
opengl - シャドウボリュームを作成するときにGLSLで後ろ向きの頂点を変換する方法
私はOpenGLを使用してゲームを作成しており、シャドウボリュームを実装しようとしています。
頂点シェーダーを介してGPU上にモデルのシャドウボリュームを構築したいと思います。そのために、モデルをVBOで表します。
- 各三角形が独自の3つの頂点を持つように、頂点が複製されます。
- 各頂点には、その三角形の法線があります
- 入らない理由で、とにかく上記の2つのポイントを実際にやっていたので、頂点の重複についてはあまり心配していません。
- 縮退した三角形が追加され、「通常の」三角形の各ペア間のエッジの内側に四角形が形成されます。
このモデル形式を使用して、頂点シェーダー内で、ライトの反対側を向いている三角形の一部である頂点を見つけ、それらを後ろに移動してシャドウボリュームを形成することができます。
私が理解するために残したのは、後ろ向きの頂点に正確にどのような変換を適用する必要があるかです。
頂点がライトの反対側を向いていることを検出することはできますが、どの変換を適用する必要があるのかわかりません。これは私の頂点シェーダーがこれまでのように見えるものです:
単純にに設定gl_position
してみましftransform() - (vec4(realLightDir, 1.0) * someConstant)
たが、これにより、ある種の深度テストのバグが発生し(ボリュームをカラーでレンダリングすると、一部の面が他の面の後ろに見えるように見えました)someConstant
、背面がどこまで伸びるかには影響しなかったようです。 。
更新-1月22日
私がおそらくどのスペースにいるかについての質問を明確にしたかっただけです。私がどのスペースにいるかを追跡することは、私のシェーダーの頭痛の最大の原因であると言わなければなりません。
シーンをレンダリングするとき、私は最初にを使用してカメラをセットアップしましたgluLookAt
。カメラは固定されている場合もあれば、動き回っている場合もあります。それは問題ではないはずです。glTranslated
次に、モデルを配置するなどの変換関数を使用します。
プログラム(つまりCPU上)では、世界空間(3つのフロート)で光ベクトルを表します。開発中に、この光ベクトルをシェーダーの適切なスペースに配置するには、カメラを設定した後、モデルを配置する前に、モデルビューマトリックスの逆数を掛ける必要があることがわかりました。したがって、私のプログラムコードは次のようになります。
- ポジショニングカメラ(
gluLookAt
) - ワールド空間にある光ベクトルを取得し、それを現在のモデルビューマトリックスの逆行列で乗算して、シェーダーに渡します。
- 位置モデルへの変換
- モデルの描画
これは何かを明確にしますか?