問題タブ [shader]

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.

0 投票する
1 に答える
718 参照

.net - D3D パフォーマンスの比較、シェーダーとビルトイン シェーディング

D3D に組み込まれた実行中の 3D エンジンがあります (SlimDX 経由)。レンダリング パイプラインの中断を避けるために、同じマテリアルを持つ多くのオブジェクトをより大きなメッシュにまと​​めました (状態の切り替えを減らすため)。これはうまく機能し、私のニーズに適したパフォーマンスレベルを提供します.

私が直面している問題は、実行時に、これらの大きなバッチ メッシュのサブセットのマテリアル プロパティを変更する必要があることです。そのために属性バッファを使用していますが、かなりうまく機能しています。以前は限られた数のアクティブ アトリビュート (メッシュあたり約 5 つ) を使用していましたが、今ではマテリアルにさらに多くのバリエーション (不透明度/カラーブレンドのさまざまな色合い) が必要であり、最終的には 100 以上の組み合わせになる可能性があります。これらの変更は実行時に発生するため、レンダリングが開始される前にそれらをまとめることはできません。確かにメッシュを再構築することはできましたが、それは遅く、マテリアル間の切り替えはインタラクティブな速度で行う必要があるため、そうではありません。

だから私の質問は、どのルートを取るのが最善ですか?

  • 必要に応じて使用可能な属性 ID で顔を動的にマスクし、完了したらリセットする、より堅牢な属性処理システムを実装する必要がありますか? アトリビュート バッファのフラグメンテーションがパフォーマンス ヒットを追加することを聞いたことがあります。また、間にマテリアル スイッチがある後続の DrawSubset() 呼び出しのパフォーマンス ヒットについても確信が持てません (つまり、いつが多すぎて、いつアトリビュート配列を最適化する必要がありますか?)。これについて経験のある人はいますか?

  • 私のもう 1 つのアイデアは、パラメーター化されたピクセル シェーダーを使用することです。派手なエフェクトは必要ありません。最低限必要なだけです (現在は、色のみで一部のオブジェクトが透明な組み込みのフラット シェーダーです)。そのため、シェーダー モデル 1 で十分です。ここでのアイデアは、1 つの汎用シェーダーを使用し、呼び出し間でマテリアルを切り替える代わりに、いくつかのシェーダー パラメーターを変更することです。しかし、これがマテリアルの切り替えよりも速いかどうか、および/またはプログラム可能なシェーダーがビルドインシェーダーよりも遅いかどうかはわかりません(同じ結果が与えられた場合)。

また、メッシュの切り替えと 1 つの大きなメッシュでの異なるサブセットの描画との間のパフォーマンス ヒットの違いについても興味があります (両方のケースで同じ数のマテリアル スイッチが与えられた場合)。

これらの質問は、GFXカードとそれぞれのパフォーマンス/年齢によって多少異なる場合があることを理解していますが、ここでは、何に最も力を注ぐべきかについての一般的なガイドラインを探しています (つまり、どのタイプの状態スイッチ/ CPU 干渉が最大のGPU ヒット)。メモリも懸念事項であるため、メッシュ全体 (または大部分) を複製する実装は私には不可能です。

私の焦点は、古い (5 歳)/機能の少ない/統合された GFX カードでのパフォーマンスであり、必ずしも最上位のゲーマー カードやワーク ステーション カード (Quadro など) ではありません。特定のボードでシェーダーのパフォーマンスがどれだけ優れているかに応じて、シェーダーを使用したソリューションを成功または失敗させる可能性があると思います。

すべての提案とフィードバックは大歓迎です。

よろしくお願いします!

0 投票する
4 に答える
5742 参照

c++ - シェーダーの制限

Radeon HD 3850を搭載したラップトップ用にゲームのレンダラーを調整しています。このチップはかなりの処理能力を備えていますが、メモリ帯域幅が限られているため、より多くのシェーダー作業をより少ないパスに移動しようとしています。

以前は、単純なマルチパスモデルを使用していました。

  • FP16ブレンドバッファーをバインドしてクリアします(デプスバッファー付き)
    • 深度のみのパス
    • ライトごとに、追加のライトパスを実行します
  • バックバッファをバインドし、テクスチャとしてブレンドバッファを使用します
    • トーンマッピングパス

このメソッドのパフォーマンスを向上させるために、ライトの数とタイプをカウントしてカスタムGLSLシェーダーを動的に構築する新しいレンダリングパスを作成しました。これらのシェーダーは、すべてのライトパラメーターをユニフォームとして受け入れ、すべてのライティングを1回のパスで実行します。なんらかの限界にぶつかると思っていたので、まずは1灯でテストしました。それから3つ。次に21で、エラーやアーティファクトがなく、優れたパフォーマンスを発揮します。これは私の実際の質問につながります:

ユニフォームの最大数は取得できますか?

この方法は古いハードウェアで実行可能ですか、それともユニフォームははるかに制限されていますか?

押しすぎると、どの時点でエラーが発生しますか?シェーダーのコンパイル?プログラムのリンク?プログラムを使用していますか?

0 投票する
2 に答える
518 参照

python - pygtkglext を使用したシェーダー

glsl シェーダーを gtk-opengl ウィンドウで動作させる方法を知っている人はいますか? glut allglCreateProgramなどの関数は機能しますが、同じ gl コードを pygtkglext ウィンドウに入れようとすると、NullReference について不平を言います:

だから I from OpenGL.GL.ARB.shader_objects import *、しかし結果は似ています:

どんなアイデアも役に立ちます。

0 投票する
2 に答える
2540 参照

c++ - ピクセルごとの照明/法線マップによる 2D レンダリング - directX

ピクセルごとの法線を使用して 2D テクスチャ クワッドをレンダリングするための最も簡単で簡単かつ最速の手法を探しています。私が意味するのは、カメラが固定され、すべてのテクスチャクワッドが同じ方向 (カメラ) を向いている 3D 世界であり、それらの間に光点があり、テクスチャにピクセルごとの法線値を持たせたいので、それらは 3D モデルであるかのように点灯します。

私がネットで見つけたほとんどのテクニックは、実際の 3D モデルを参照しているため、あまりにも複雑で重いものですが、必要なのは単純な 2D クワッドだけです。

誰かが適切なテクニックを知っているか、役に立つチュートリアルを投稿できますか? あ、DXのみお願いします。

ありがとう。

0 投票する
1 に答える
366 参照

c++ - ゲームで Photoshop のようなドロップ シャドウを作成する

ゲームのサイズが変化するゲームを作っているので、自分の影を作りたいです。私が使用している api は、四角形を塗りつぶしたり、楕円形や水平線などを作成したり、rgba をサポートしたりできます。これを考えると、どうすればドロップ シャドウを作成できますか? 黒から白へのグラデーションを作成し、アルファを 20% に設定しようとしましたが、見栄えがよくありませんでした...どのように行われたのかわかりません。ありがとう

0 投票する
1 に答える
135 参照

wpf - IronPython: WPF ShaderEffect の構築で問題が発生しました

私は、特にユーザーが独自のシェーダー効果を構築できる拡張可能なプログラムを構築しようとしています。

Google 検索でここまでたどり着きました。

しかし、それでもエラーが発生します。

TypeError: ShaderEffect の Python サブクラスがないと、保護されたメンバー RegisterPixelShaderSamplerProperty にアクセスできません。

どんな助けでも大歓迎です。

私が見つけることができるネット上で最高のソースはここにリンクされています

0 投票する
1 に答える
1174 参照

xna - XNAの問題で3D Studio Max DirectXシェーダーを使用する

更新 2:これは、プログラミングの問題というよりもモデリングの問題のようです。おっと。

私は XNA 開発に不慣れで、C# の経験があるにもかかわらず、2 日間にわたって 1 つの場所で立ち往生しています。

状況: 3D Studio Max 2010 で 2 つのマテリアルを使用するモデルを作成しました。どちらも DirectX Shader タイプです。モデルはエラーなしで FBX にエクスポートされ、Visual Studio は正しくコンパイルします。最初に Draw() メソッドを実行すると、ループの 1 つの「BasicEffect」部分で例外がスローされ、FBX に埋め込む必要がある .fx ファイルが正しくロードされていることが (少なくとも私には) 示されました。ファイルか何か。

問題: 次のコードを使用する場合

カメラの位置や角度に関係なく、画面の下半分を覆う白いボックスが表示されるだけです。Max で指定されている default.fx ファイルのエフェクト パラメータの名前を取得しました ([プログラム ファイル]\autodesk\3ds Max 2010\maps\fx にあります)。

これらの 1 つまたはすべてを間違って設定しているように感じます。チュートリアルを調べてコードに従おうとしましたが、私のモデルではうまくいかないようです。

助けやアイデアはありますか?

更新: これらの変更を行うことにより:

モデルは描くことができました。ただし、すべてが完全に白です:(

0 投票する
1 に答える
1719 参照

opengl - CocoaとOpenGL、配列を使用してGLSL頂点属性を設定するにはどうすればよいですか?

私はOpenGLにかなり慣れていないので、いくつかの問題が発生しているようです。GLSLで単純なシェーダーを作成しました。これは、指定されたジョイントマトリックスによって頂点を変換し、単純なスケルタルアニメーションを可能にすることになっています。各頂点には、最大2つのボーンインフルエンス(Vec2のxおよびyコンポーネントとして格納)、変換行列の配列に関連付けられたインデックスおよび対応する重みがあり、シェーダーで「属性変数」として指定され、設定されます。 「glVertexAttribPointer」関数を使用します。

ここで問題が発生します...行列の「UniformVariable」配列を適切に設定できました。シェーダーでこれらの値を確認すると、すべてが正しくインポートされ、正しいデータが含まれています。ただし、ジョイントインデックス変数を設定しようとすると、頂点に任意の変換行列が乗算されます。これらは、空間内のランダムな位置(毎回異なる)にジャンプします。これは、インデックスが正しく設定されておらず、シェーダーがジョイントマトリックス配列の終わりを超えて次のメモリに読み取っていると想定しています。理由はよくわかりません。このテーマについて見つけたすべての情報を読んだときに、同じ(あまり似ていない場合でも)コードが例に含まれているのを見て驚いたのですが、それはうまくいったようです。

私はかなり前からこの問題を解決しようとしましたが、本当に神経質になり始めています...行列が正しいことはわかっています。シェーダーのインデックス値を手動で任意の整数に変更すると、次のようになります。正しい行列値と正常に機能し、すべての頂点をその行列で変換しますが、作成したコードを使用して属性変数を設定しようとすると、機能しないようです。

変数を設定するために使用しているコードは次のとおりです...

そして、私の頂点シェーダーは次のようになります...

これは本当に私を苛立たせ始めています、そしてどんなそしてすべての助けも感謝されるでしょう、

-アンドリュー・ゴトウ

0 投票する
1 に答える
2517 参照

opengl - OpenGL シェーダーでのポリゴン テッセレーション

20,000 以上の 2D ポリゴンを、アウトラインと塗りつぶしを使用して OpenGL でレンダリングする必要があります。

一部のポリゴンは凹面です。

シェーダーを使用してこれを行うことは可能ですか?