2

High LevelShaderLanguageとDirectX9マネージドライブラリを使用して単純なグロー/ブラーシェーダーを作成するのに役立つリソースを見つけるのに何日も苦労してきました。

私がする必要があるのは、CustomVertex.TransformedColored頂点の配列を単純な線として描画し、HLSL効果によってぼかし/光らせることだけです。

私はインターネットを約3日間検索していくつかの結果を出しましたが、本当に良いチュートリアルや例を見つけることができません。私はHLSLの基本的な知識を持っていますが、このシェーダーの書き方を理解するのに十分な理解はありません(3冊のDirectXブックのHLSLの章も読んだことがあります)。

ここにいくつかの(要約された)コードがあります:

CustomVertex.TransformedColored[] glowVertices = new CustomVertex.TransformedColored[4];
glowVertices[0] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Cyan.ToArgb());
glowVertices[1] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Blue.ToArgb());
glowVertices[2] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Cyan.ToArgb());
glowVertices[3] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Blue.ToArgb());

this.device.BeginScene();
int passes = this.glowEffect.Begin(0);
for (int i = 0; i < passes; i++)
 {
     this.glowEffect.BeginPass(i);
     this.device.DrawUserPrimitives(PrimitiveType.LineStrip, glowVertices.Length - 1, glowVertices);
     this.glowEffect.EndPass();
 }
 this.glowEffect.End();
 this.device.EndScene();

投稿する必要のある質問の数とコードの量を考えると、HLSLの特定の部分に関するヘルプをあまり探していないと思います。実際には、リソースを見つけるためのヘルプを探しています。

4

1 に答える 1

6

私があなたのコードで目にする当面の問題は、シェーダーを行自体に適用していることです。ピクセル シェーダーは実際にはそのようには機能しません。シェーディングされているピクセルの周囲のピクセルを操作することはできません。得られるのは、出力されている 1 つのピクセルのレジスタ (位置、色、テクスチャ座標など) とサンプラ (テクスチャ) だけです。

これを回避するには、ぼかし効果 (グローやブルームなど) を行う基本的なプロセスは、ぼかしたいシーンをレンダー ターゲットに描画することです。次に、そのレンダー ターゲットを、ブラー シェーダーで描画するフルスクリーン クワッドのテクスチャとして使用します。シンプルなブラー シェーダーは、そのテクスチャから複数のサンプルを取得します。それぞれのサンプルは、テクスチャ座標がわずかにオフセットされています。その結果、テクスチャのイメージがぼやけます。

通常、このプロセスを繰り返して (今度は、レンダー ターゲット オン ア フルスクリーン クワッドを別のレンダー ターゲットにレンダリングします)、水平方向に 1 回、垂直方向に 1 回ブラーを実行して、最小数のサンプルで最大のブラーを取得します。

XNA Bloom Sampleを参照することをお勧めします。そこには、プロセスに関するより広範なドキュメントがあります。API は DirectX ではなく XNA ですが、かなり似ており、どちらも HLSL を使用しています。

于 2010-11-22T23:13:54.520 に答える