問題タブ [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 で gl_FragCoord を計算する方法
わかりました、私の GLSL フラグメント シェーダーでは、空間内の特定の線からフラグメントまでの距離を計算できるようにしたいと考えています。
この結果、最初に頂点シェーダーでさまざまな vec2 セットを使用して、最終的な結果をミラーリングしようとしていますgl_FragCoord
。
今私が期待するフラグメントシェーダーで:
しかし、そうではありません。パイプラインは、私が怠っているgl_Position
ものに変えるためにどのような操作を行いますか?gl_FragCoord
fake_frag_coord
c++ - 3D タンジェント スペースの計算
GLSL シェーダーで法線マッピングを使用するには、各頂点の法線ベクトル、接線ベクトル、複接線ベクトルを知る必要があります。RenderMonkey は、独自の定義済み変数 (rm_tangent
およびrm_binormal
) を提供することで、これを簡単にします。この機能を自分の 3d エンジンに追加しようとしています。各頂点の xyz 座標、UV テクスチャ座標、法線ベクトルを使用して、三角形の各頂点のタンジェントとバイタンジェントを計算できるようです。いくつかの検索の後、三角形構造の各頂点のタンジェントとバイタンジェントを計算するこの関数を考案しました。
この関数を使用して計算値をシェーダーに送信すると、モデルは RenderMonkey の場合とほぼ同じように見えますが、非常に奇妙な方法でちらつきます。OpenGL を送信している接線と従接線に問題があることを突き止めました。これにより、私のコードが何か間違っているのではないかと疑うようになります。誰でも問題を確認したり、他の方法を試すための提案をしたりできますか?
また、上記のコードは非常にハックであり、何が起こっているかの背後にある数学をほとんど理解していないことも指摘しておく必要があります。
opengl - opengl はどのミップレベルを使用するかをどのように決定しますか?
質問はかなり自明です。どこからでも取得できるテクスチャ座標 (均一、可変、別のテクスチャ フェッチ) の使用に関して質問しています。
たとえば、ミップマップされた (または異方性フィルタリングされた) テクスチャでテクスチャ フェッチを行い、頂点シェーダーで設定された可変の 2 乗を使用するとします。glsl はこのような任意に複雑な関数の導関数を決定できないと思いますが、どのミップ レベルを使用するかをどのように判断するのでしょうか?
ありがとう。
opengl - データ シェーダーで使用するために、OpenGL インデックス付きバッファー配列で複数のテクスチャをどのように処理しますか?
私はこの論文を実装しようとしています。私はそれのほとんどをダウンさせましたが、幾何学的なエッジを決定して表示するためにシェーダーに任意の非幾何学的データを送信することに関する部分が問題を引き起こしています. VBOについて知っていることを使用して、ほとんどのデータを問題なく送信できました。ただし、大量のデータを送信する必要があるため、複数のテクスチャ座標を使用する必要があります。
テクスチャ座標の複数のセットを設定する正しい方法であると思われるいくつかのバリエーションを既に実装し、多くのフォーラム ポスターの指示に従いました。これまでのところ、解決策はありません。
コンテキストとして、プログラムは、モデル内の一意のエッジごとに、4 つの頂点、2 つの法線ベクトル、浮動小数、および整数 (浮動小数として格納) のセットの 4 つのほぼ同一のコピーを送信しています。次のようにデータをレイアウトしました。
4 つのコピーの唯一の違いは i 値です。これは、描画可能なエッジが見つかった場合に頂点を編成する方法を決定するのに役立ちます。
ご覧のとおり、少なくとも 3 つのテクスチャ座標が必要です。最初のもの (gl_MultiTexCoord0) は問題なく動作しましたが、グラフィック カード上にある次のテクスチャ座標は制御不能な動作をしているように見え、動作することもありますが、通常は動作しません。
私のレンダリング関数は、次のように使用されていました。
これは私のオリジナルでした。v0、v1、および v2 で確実に機能します。「r and i」で機能するように見えますが、それは錯覚である可能性があります。n0 または n1 をテストする機能はまだありません。v3 は確実に機能しません。ご覧のとおり、ポイントとして描画しているため、(シェーダーを介して) そこにあるかどうかがわかります。v0、v1、および v2 がすべて存在します。v3 で同じことをしようとすると、原点に 1 つのポイントが生成されるか、何も生成されません。
オンラインで提案を見た後、ここに私の新しいセットアップがあります:
各テクスチャ座標リストの実際の「読み込み」の周りでglEnableClientState
/呼び出しをどのように行ったかに注意してください。glDisableClientState
と も使用glActiveTextureARB
しglEnable(GL_TEXTURE_2D)
ます。ここで が必要な理由は理解できると思いますがglActiveTextureARB
、もう 1 つは困惑します。GLSL Common Mistakes pageによると、glEnable(GL_TEXTURE_2D)
シェーダーの使用はとにかくこの呼び出しを無視するため、独自のシェーダーを作成するときに使用することは想定されていません。
それだけです。テクスチャ座標で非テクスチャ座標データを送信する方法を具体的に説明しているチュートリアルを見つけることができずに、ここまで来ました。おそらく誰かがそのチュートリアルを知っていれば、私の問題は軽減されるでしょう. 御時間ありがとうございます!
javascript - HTML 5 フィルター言語またはフィルター言語の類似物?
HTML 5 フィルタリング言語またはフィルター言語の類似物はありますか? GLSL / HYDRA / HLSL や JS ピクセル フィルター/シェーダー ライブラリのようなものですか?
glsl - glslでビット演算を実行するにはどうすればよいですか
glslでビット演算を実行するにはどうすればよいですか?
通常のCスタイルのビット演算子、、、、またはを使用|
して&
も機能しません。 ^
!
opengl - フラグメント シェーダー: 出力変数
GLSL 1.40 仕様を読む:
フラグメント出力は、float、浮動小数点ベクトル、符号付きまたは符号なしの整数または整数ベクトル、またはこれらの配列のみにすることができます。行列と構造体は出力できません。フラグメント出力は、次の例のように宣言されます。
vec4 FragmentColor を出力します。out uint 光度;
フラグメントの色は、gl_FragColor と記述して定義されています...そうですか? 誰かがこれらの出力に関する私の考えをクリアできますか? フラグメントの色を決める例の「FragmentColor」だけ書いてもいいですか?それらを読み返してもよろしいですか (「光度」など)?
opengl - GLSLで複数のテクスチャをレンダリングする方法
すべてのレンダリングを「古い」openglからglslに移植しようとしています。
今は異なるテクスチャのメッシュがあるので、「古い」glではbindTextureを使用してテクスチャを変更しました。私はまだこれを行う必要があると思いますが、私のすべてが最初のテクスチャのみでレンダリングされているように見えるため、何かが欠けています。
「tex」は、次のようにglslに付けたテクスチャの名前です。
注:マルチテクスチャについては話していません!:-)
c++ - シェーダーの制限
Radeon HD 3850を搭載したラップトップ用にゲームのレンダラーを調整しています。このチップはかなりの処理能力を備えていますが、メモリ帯域幅が限られているため、より多くのシェーダー作業をより少ないパスに移動しようとしています。
以前は、単純なマルチパスモデルを使用していました。
-
FP16ブレンドバッファーをバインドしてクリアします(デプスバッファー付き)
- 深度のみのパス
- ライトごとに、追加のライトパスを実行します
-
バックバッファをバインドし、テクスチャとしてブレンドバッファを使用します
- トーンマッピングパス
このメソッドのパフォーマンスを向上させるために、ライトの数とタイプをカウントしてカスタムGLSLシェーダーを動的に構築する新しいレンダリングパスを作成しました。これらのシェーダーは、すべてのライトパラメーターをユニフォームとして受け入れ、すべてのライティングを1回のパスで実行します。なんらかの限界にぶつかると思っていたので、まずは1灯でテストしました。それから3つ。次に21で、エラーやアーティファクトがなく、優れたパフォーマンスを発揮します。これは私の実際の質問につながります:
ユニフォームの最大数は取得できますか?
この方法は古いハードウェアで実行可能ですか、それともユニフォームははるかに制限されていますか?
押しすぎると、どの時点でエラーが発生しますか?シェーダーのコンパイル?プログラムのリンク?プログラムを使用していますか?