代码之家  ›  专栏  ›  技术社区  ›  tbridge

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

  •  2
  • tbridge  · 技术社区  · 14 年前

    几天来,我一直在努力寻找任何资源来帮助我使用高级着色器语言和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的某个特定部分寻求帮助,考虑到我需要发布的问题和代码的数量,我只是在寻找一些帮助查找资源!

    1 回复  |  直到 14 年前
        1
  •  6
  •   Andrew Russell    14 年前

    我看到你的代码的直接问题是你正在将一个材质球应用到线条本身。像素着色器并不是真的那样工作。不能与被着色像素周围的任何像素交互。所有你得到的是寄存器(位置,颜色,纹理坐标等)和采样器(纹理)的一个像素,正在输出。

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

    通常重复此过程(现在将render-target-on-a-full-screen-quad渲染到另一个渲染目标),水平和垂直进行一次模糊处理,以使用最少的采样数获得最模糊的效果。

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