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

C# DirectX9中的简单HLSL发光/模糊效果,c#,hlsl,managed-directx,directx-9,glow,C#,Hlsl,Managed Directx,Directx 9,Glow,几天来,我一直在努力寻找任何资源来帮助我使用高级着色器语言和DirectX 9托管库编写一个简单的光晕/模糊着色器 我所需要做的就是创建一个CustomVertex.TransformedColored顶点数组,绘制为简单的线,然后通过HLSL效果模糊/发光 我已经在互联网上搜索了大约三天,有一些结果,但我就是找不到真正好的教程或例子。我对HLSL有一个基本的了解,但我对它的理解还不足以理解如何编写这个着色器(我还阅读了3本DirectX书籍中的HLSL章节) 以下是一些(节略)代码: Cust

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

我所需要做的就是创建一个
CustomVertex.TransformedColored
顶点数组,绘制为简单的线,然后通过HLSL效果模糊/发光

我已经在互联网上搜索了大约三天,有一些结果,但我就是找不到真正好的教程或例子。我对HLSL有一个基本的了解,但我对它的理解还不足以理解如何编写这个着色器(我还阅读了3本DirectX书籍中的HLSL章节)

以下是一些(节略)代码:

CustomVertex.TransformedColor[]GlowVertex=新的CustomVertex.TransformedColor[4];
GlowVertex[0]=新的CustomVertex.TransformedColor(random.Next(this.render.Width)、random.Next(this.render.Height)、1、1、Color.Cyan.ToArgb());
GlowVertex[1]=新的CustomVertex.TransformedColor(random.Next(this.render.Width)、random.Next(this.render.Height)、1,1、Color.Blue.ToArgb());
GlowVertex[2]=新的CustomVertex.TransformedColor(random.Next(this.render.Width)、random.Next(this.render.Height)、1、1、Color.Cyan.ToArgb());
GlowVertex[3]=新的CustomVertex.TransformedColor(random.Next(this.render.Width)、random.Next(this.render.Height)、1、1、Color.Blue.ToArgb());
this.device.BeginScene();
int passs=this.glowEffect.Begin(0);
for(int i=0;i

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

我在代码中看到的直接问题是,您正在对行本身应用着色器。像素着色器实际上不是这样工作的。无法与被着色像素周围的任何像素交互。所有你得到的是寄存器(位置,颜色,纹理坐标等)和采样器(纹理)的一个像素是输出

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

通常,重复此过程(现在将“全屏渲染”四元体渲染到另一个渲染目标),在水平方向和垂直方向分别执行一个模糊和一个模糊,以最少的采样数获得最模糊的效果


我建议你看看这个。这里有关于这个过程的更广泛的文档。虽然API是XNA,而不是DirectX,但它们非常相似,都使用HLSL。

是的,我想我不太清楚。我知道你所说的一切,我将线条渲染为纹理,将其应用于四边形,然后使用HLSL渲染该四边形。我想我正在寻找的是HLSL方面,将与它一起。感谢Bloom示例,我将对此进行研究:)该示例证明非常有用。最后是一个简单/强大的HLSL示例,它没有100个线着色器。
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();