DirectX9中的简单HLSL发光/模糊效果

tbr*_*dge 2 c# hlsl glow directx-9 managed-directx

我一直在努力寻找任何资源来帮助我使用高级着色器语言和DirectX 9托管库编写简单的辉光/模糊着色器.

我需要做的就是将一系列CustomVertex.TransformedColored顶点绘制成简单的线条,然后通过HLSL效果模糊/发光.

我已经在互联网上搜索了大约三天的一些结果,但我找不到一个非常好的教程或示例.我对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();
Run Code Online (Sandbox Code Playgroud)

我想我不是在寻找HLSL特定部分的帮助,考虑到我要发布的问题和代码数量,我真的只是寻找一些帮助寻找资源!

And*_*ell 6

我在您的代码中看到的直接问题是您正在将线条应用于线条本身.像素着色器并没有真正起作用.您无法与被着色的像素周围的任何像素进行交互.所有你得到的就是输出的那个像素的寄存器(位置,颜色,纹理坐标等)和采样器(纹理).

要解决此问题,执行模糊效果(例如发光或绽放)的基本过程是将要模糊的场景绘制到渲染目标.然后将该渲染目标用作使用模糊着色器绘制的全屏四边形上的纹理.一个简单的模糊着色器需要从该纹理中获取多个样本 - 每个样本都有一个稍微偏移的纹理坐标.结果是纹理图像模糊.

通常,您重复此过程(现在将渲染目标在全屏幕四边形渲染到另一个渲染目标),水平模糊一次,垂直模糊一次,以最少的样本数量获得最多模糊.

我建议看一下XNA Bloom Sample.那里有关于该过程的更广泛的文档.虽然API是XNA,而不是DirectX,但它们非常相似,并且都使用HLSL.