gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:22:02 29 4
gpt4 key购买 nike

几天来我一直在努力寻找任何资源来帮助我使用高级着色器语言和 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();

我想我并不是在寻求关于 HLSL 特定部分的帮助,考虑到我必须发布的问题数量和代码量,我实际上只是在寻找一些帮助来寻找资源!

最佳答案

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

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

通常,您会重复此过程(现在将全屏四边形上的渲染目标渲染到另一个渲染目标),水平进行一次模糊,垂直进行一次模糊,以使用最少的样本数获得最大的模糊效果.

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

关于c# - DirectX9 中的简单 HLSL 发光/模糊效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4248505/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com