タグ付けされた質問 「fragment-shader」

ピクセルの出力色を決定するためにGPUで実行されるプログラム。フラグメントシェーダーとも呼ばれます。

3
鏡面シェーディングでR(phong)の代わりにH(blinn)が使用されるのはなぜですか?
この理由はどこにもありません。phongで使用される反射ベクトルは、物理学の基礎が単純です。しかし、blinnで使用されるハーフベクトルは、一見合理的な根拠がなく、適切な反映を構成していません。それにもかかわらず、いわゆる「物理ベース」のシェーディング機能すべてで使用されています。それに物理的な基盤があれば、知りたいのですが。 私が見つけることができたのはいくつかの理由です: それは速いです -これについてはさまざまな情報がありますが、それでも1998年には大きな理由だったでしょう。 これは90度よりも高い角度をより適切に処理します。これが唯一の理由である限り、フォンの用語が不適切に使用されているためです。反射とビューのドット積は、-1〜+1の角度を与えます。通常、この角度は0〜1に固定されており、これが90度問題の直接的な原因です。角度を固定するのではなく再正規化すると、180度の完全なカバレッジが得られます。私は、単純なx * 0.5 + 0.5の操作がグラフィックスの世界を40年間逃げていたとは信じません。 エッジをより適切に処理します -エッジの「問題」もblinnソリューションにわずかに存在します。主な原因は、ターミネーターでのエリア照明の不適切なシミュレーションです。これは、「物理ベースの」シェーダーに不可欠です。しかし、より単純な状況でも、シグモイド関数はソフトターミネーターラインを正しく近似できます。ランバート項への乗算は、鏡面反射項を不適切に減衰させるため不正確です。これにより、フレネル項がキャンセルされ、さらなるエラーが発生する可能性があります。 エッジに長い反射があります -異方性反射は現実的かもしれませんが、blinnはエッジにのみ表示されるため、それらを実装する正しい方法ではないようです。H項のエラーが偶然現実的に見えるのは、単なる幸せな偶然です。 これらの理由はどれも満足のいくものではありません。この狂気を整理したいと思います。 私はブリンとフォンの話ではないのですということを明確にしたい、特に、代わりにこれらのシェーダだけでなく、他の人のための基礎として使用されているベクトル成分HとR、程度。

2
深度テストを使用していなくても、ピクセルを破棄するパフォーマンスを失いますか?
破棄命令を最初に検索したとき、破棄を使用するとパフォーマンスが低下するという専門家がいます。ピクセルを破棄すると、zBufferを適切に使用するGPUの機能が破損するため、GPUは両方のオブジェクトに対してフラグメントシェーダーを最初に実行して、カメラに近いものが破棄されるかどうかを確認する必要があると述べました。現在作業中の2Dゲームの場合、depth-testとdepth-writeの両方を無効にしました。私はすべてのオブジェクトをその深さでソートして描画していますが、それはすべてです。GPUが派手なことをする必要はありません。今、フラグメントシェーダーでピクセルを破棄するのはまだ悪いのではないかと思っています。

2
GLSL-ワンパスガウスぼかし
ワンパスガウスぼかしを行うフラグメントシェーダーを実装することは可能ですか?2パスブラー(ガウスおよびボックスブラー)の実装が多数見つかりました。 http://callumhay.blogspot.com/2010/09/gaussian-blur-shader-glsl.html http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/ http://www.geeks3d.com/20100909/shader-library-gaussian-blur-post-processing-filter-in-glsl/ 等々。 私はガウスぼかしを畳み込みとして実装することを考えてきました(実際、それは畳み込みであり、上記の例は単なる近似です)。 http://en.wikipedia.org/wiki/Gaussian_blur

3
オブジェクトがサーフェスの近くにあるときに点灯するシェーダーを作成するにはどうすればよいですか?
で、このオーバーウォッチゲームプレイ映像、キャラクターのシールドは、他のオブジェクトのジオメトリの近くにある地域で白点灯します。 床、壁、柱の近くの青いシールドの白い縁に注意してください。 シールドには独自のモデルがあり、効果はシェーダーで行われると思いますが、「近さ」の概念をシェーダープログラミングに変換する方法を理解しようとしていません。

2
可変線幅のトゥーン/セルシェーディング?
私はセルシェーディングを行うためにそこにいくつかの広範なアプローチを見ています: 法線が反転したモデルの複製と拡大(私にとってはオプションではありません) エッジ検出へのSobelフィルター/フラグメントシェーダーアプローチ エッジ検出へのステンシルバッファアプローチ 面とエッジの法線を計算するジオメトリ(または頂点)シェーダーアプローチ たとえば、ジオメトリ中心のアプローチが照明や線の太さを最大限に制御できると仮定するのは正しいでしょうか。丘のシルエットラインが徐々に平野に合流するのを見るかもしれない地形のために? 地形の表面にピクセル照明が必要ない場合はどうすればよいですか?(そして、セルベースの頂点ベースまたはテクスチャマップベースのライティング/シャドウイングを使用する予定ではないでしょう。)それから、ジオメトリタイプのアプローチを続けるか、代わりにスクリーンスペース/フラグメントアプローチを使用する方が良いでしょうか物事をシンプルに保つために?もしそうなら、メッシュ全体のアウトラインだけではなく、メッシュシルエット内の丘の「インク」をどのように取得し ますか(そのアウトライン内に「インク」の詳細はありませんか?(示唆的な輪郭、折り目))。 最後に、ジオメトリシェーダーを使用して、反転法線アプローチを安価にエミュレートすることは可能ですか?これに関する私の懸念は、すべての頂点を確実に複製し、それに応じてスケーリングできることですが、法線の反転やフラグメントシェーダーの明確な色付けにどのようにアプローチするのでしょうか? 私が欲しいもの-シルエット内の邪魔な線で線の太さを変える... 欲しくないもの... 編集:さらなる研究により、次のことが明らかになりました... 私は地形に大量の頂点を持っているため、距離ベースのLoDを考慮しても、すべての複製とスケーリングに伴う計算の複雑さのために、フリップされた法線もジオメトリシェーダーベースのアプローチも(錐台カリングを使用しても)賢明なオプションになりますアップロードされた頂点。 テレインサーフェス上でソリッドトーンシェーディングの形でピクセル単位のライティングを必要としないことを考慮すると、これらのように、フェース法線ベースのアプローチ(そうでない場合は正しいサーフェスライティングの要件)を検討することも賢明ではなくなります計算するのは当然非常に高価です。しかし、それらが最高レベルの制御を提供することは事実です。たとえば、「芸術的な」ストロークを使用してエッジをシェーディングする機能:美しいですが、非常に複雑なゲーム環境では実際には実行できません。 ステンシルバッファーは、シェーダーですべての作業を行うことを好むため、避けたいものです。(上記の赤いアウトラインの例は、ステンシルバッファーで行われました-古い学校です。) これにより、フラグメントシェーダーのイメージ空間アプローチが残ります。計算の複雑さは、頂点の数ではなくフラグメントの数に削減されます(私の場合、これはジオメトリシェーダーで行う必要がある操作よりも10〜100倍少ない操作です)。これには、不連続フィルター(Sobel演算子など)を適用できるgバッファー(通常バッファーとオプションで深度バッファーで構成される)を生成するために、複数のレンダーパスが必要です。深さの不連続性は、示唆的な輪郭と折り目を可能にします。このアプローチの私の唯一の問題は、インクエッジの幅をより細かく制御できないことですが、フラグメントシェーダーの適切なアルゴリズムを使用すれば、これが可能になると確信しています。 質問はより具体的になりました:フラグメントシェーダーで、特に外側のシルエットで、可変エッジ幅をどのように正確に取得するのですか?

2
GLSLシェーダー-色相/彩度/輝度の変更
GLSLフラグメントシェーダーを使用して画像の色相を変更しようとしています。Photoshopの色相/彩度調整レイヤーに似たものを実現したい。 次の画像では、私がこれまでに得たものを見ることができます。緑色の正方形の色相を変更して右側の赤い正方形のようにしたいのですが、このシェーダーでは半分の赤い半分のピンクの正方形(中央の正方形)が得られます。 フラグメントシェーダーで行っているのは、テクスチャの色をHSVに変換してから、頂点シェーダーから取得したHSV色を追加して、色をRGBに変換し直すことです。 私は何を間違えていますか? フラグメントシェーダー: precision mediump float; varying vec2 vTextureCoord; varying vec3 vHSV; uniform sampler2D sTexture; vec3 convertRGBtoHSV(vec3 rgbColor) { float r = rgbColor[0]; float g = rgbColor[1]; float b = rgbColor[2]; float colorMax = max(max(r,g), b); float colorMin = min(min(r,g), b); float delta = colorMax - colorMin; float …

5
カードゲームでカードのドロップシャドウ効果を描画するために、どのレンダリングテクニックを使用しますか?
どのような種類のシェーディングアルゴリズムを使用して、これらのような影を作成できますか? 私が作っているものは似ていますが、すべてOpenGLを使用した2D描画APIで行われているため、Z座標はありません。 さらに、手自体については、次のような陰影を付けたいと思います。 それに近い影付きの外観を実現する方法がわかりません。 カードの数は変化するはずであり、カードはテーブルに投げられるので、どのような種類のライトマップも使用できません。 どのような種類のアルゴリズムを検討する必要があります(実行する必要があるとわかっているぼかしは別ですか?) ありがとう 更新 2Dカードゲームを作っています。私は、カードからドロップシャドウのオフセットを少し追加します: 私がそれをすることを考えている方法は次のとおりです。 バックバッファと同じサイズのテクスチャを保持します。 そのテクスチャの間に合わせのカードとして暗い長方形を描きます。 そのテクスチャをぼかします。 そのテクスチャにカードを引きます。 カードをさらに照明します。 このテクスチャをバックバッファに描画します。 私の質問は: これは正しい方法ですか? テクスチャにレンダリングせずにそれを行う方法はあり ますか(バックバッファと同じ大きさのビットマップを保持します)? バックバッファサイズが最大テクスチャサイズを超えないと想定しても安全ですか?(つまり、バックバッファ が2000x3000 であれば、 そのサイズのビデオメモリにテクスチャを作成できると言っても安全ですか? ありがとう

1
レイヤー間にキャストされた2Dシャドウを実装するにはどうすればよいですか?
別のレイヤーのオブジェクトによってキャストされる2Dシャドウを実装するにはどうすればよいですか? Catalin Zimaの有名なチュートリアルの動的照明とは異なります。 しかし、このビデオのパイプの影のように: そして、このビデオのプラットフォームの影とキャラクターのように: 多くのレイヤーとさまざまな色の多くのライトがあるシーンで同じ種類のライティングを使用したいと思います。 レイヤーの背後にあるレイヤーの上にレイヤーの黒いコピーを描画し、影がキャストされているレイヤーの穴に応じて調整することで、これを想像できます。しかし、私はこれのためのより安価な、ピクセルシェーダーベースのアプローチがあることを願っています。

1
ピクセルの忠実度を維持する変換された2Dスプライト用の「レトロ」ピクセルシェーダーを作成する方法
以下の画像は、背景の上にポイントサンプリングを使用してレンダリングされた2つのスプライトを示しています。 左の頭蓋骨には回転/スケーリングが適用されていないため、すべてのピクセルが背景と完全に一致しています。 右の頭蓋骨が回転/スケーリングされ、これにより軸が揃えられなくなった大きなピクセルが生成されます。 変換されたスプライトを右側にレンダリングし、残りのシーンと同じサイズのピクセルを軸に揃えたピクセルシェーダーを開発するにはどうすればよいですか? これは、モンキーアイランドなどの古いゲームでスプライトスケーリングがどのように実装されたかに関連している可能性があります。これは、私が達成しようとしている効果ですが、回転が追加されているためです。 編集する kaoDの提案に従って、私は問題を後処理として対処しようとしました。最も簡単な方法は、最初に別のレンダーターゲットにレンダーし(目的のピクセルサイズに一致するようにダウンサンプリングし)、2回目にレンダーするときにそれをアップスケールすることでした。上記の私の要件に対処しました。 最初に私はそれLinear -> Pointをやってみました、そして結果はこれでした: 歪みはありませんが、結果はぼやけて見え、ハイライトカラーのほ​​とんどが失われます。私の意見では、それは私が必要としたレトロな外観を壊します。 2回目に試したところPoint -> Point、結果は次のようになりました。 歪みはあるものの、私のニーズにはそれで十分かもしれませんが、静止画としては動きよりも見た目は良くなります。 実例として、これは効果のビデオですが、YouTubeはピクセルを除外しています。 http://youtu.be/hqokk58KFmI ただし、移動中の歪みの量を減らしながら、くっきりした外観を維持できる優れたサンプリングソリューションを誰かが思いついた場合は、質問を数日間開いたままにしておきます。

1
重いフラグメントシェーダーのパフォーマンスの最適化
次の一連のシェーダーの最適化についてサポートが必要です。 バーテックス: precision mediump float; uniform vec2 rubyTextureSize; attribute vec4 vPosition; attribute vec2 a_TexCoordinate; varying vec2 tc; void main() { gl_Position = vPosition; tc = a_TexCoordinate; } 断片: precision mediump float; /* Uniforms - rubyTexture: texture sampler - rubyTextureSize: size of the texture before rendering */ uniform sampler2D rubyTexture; uniform …

3
スプライトの概要
現在2Dゲームに取り組んでおり、現在の仕事は選択したオブジェクトの輪郭を描くことです。 基本的にぼかしシェーダーを使用して完全に実行します。最初に垂直ガウスぼかしシェーダーを使用してスプライトを描画し、次に水平ガウスぼかしシェーダーを使用してスプライトを描画してから、通常どおりスプライトを描画します。 これが私のぼかしシェーダーです:sampler TextureSampler:register(s0); #define SAMPLE_COUNT 15 float2 SampleOffsets[SAMPLE_COUNT]; float SampleWeights[SAMPLE_COUNT]; float4 PixelShaderFunction(float2 texCoord : TEXCOORD0) : COLOR0 { float4 c = 0; // Combine a number of weighted image filter taps. for (int i = 0; i < SAMPLE_COUNT; i++) { c += tex2D(TextureSampler, texCoord + SampleOffsets[i]) * SampleWeights[i]; …

1
GL ES:フラグメントシェーダーの最適化
概要: スプライトに色を付けようとするとすぐにFPSの速度が低下します(つまり、テクスチャをフラグメントシェーダーで色と乗算します)。 詳細: ハードウェア:iPod touch 4 glDrawArraysを使用して画面に700のスプライトを描画しています。そして、はい、これらすべてを1回の描画呼び出しでバッチ処理しています。以下は、頂点データ構造を示しています。 struct Vertex { float Position[2]; float Color[4]; float Texture[2]; }; はい、いくつかのスプライトを選択的に着色する必要があるので、他のスプライトを選択的に着色する必要がないため、各頂点で色を送信しています。以下は私が使用しているフラグメントシェーダーです: varying lowp vec2 TexCoord; uniform sampler2D TextureSampler; void main(void) { gl_FragColor = texture2D( TextureSampler, TexCoord ); } 今までそれは素晴らしい仕事をしていて、私に完全な60 FPSを与えています!!! だが フラグメントシェーダーを次のように変更するとすぐに(着色を可能にするため): varying lowp vec4 DestinationColor; varying lowp vec2 TexCoord; uniform sampler2D TextureSampler; …

1
スクリーンスペースデリバティブを使用して、ピクセルシェーダーでパラメトリック形状をアンチエイリアスするにはどうすればよいですか?
でバルブのアルファテスト済み倍率紙、それはアンチエイリアシングを行うための「ピクセル単位のスクリーン空間誘導体」を使用して言及しています。私の理解では、これがあることであるddxとddyHLSLでの組み込み関数? シェーダーでパラメトリックシェイプ(たとえば、円:x²+y²<1)を描画しようとしていますが、このテクニックを使用して、シェイプのエッジピクセルを正しくアンチエイリアスする方法がわかりません。誰かが例を提供できますか? 完全を期すために、私が作成している種類のピクセルシェーダーの例を次に示します。 float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0 { float dist = input.TexCoord.x * input.TexCoord.x + input.TexCoord.y * input.TexCoord.y; if(dist < 1) return float4(0, 0, 0, 1); else return float4(1, 1, 1, 1); }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.