后端 Deferred Shading

honwhy · November 02, 2019 · 21 hits

Optimization

Refact WorldPosition from depth

Tricks

组合 Deferred Shading 和 Instanting Shading 的结果

Deferred Shading 的渲染通常是使用 Overlay 来完成的,如果采用默认设置它回复改掉所有之前的结果,解决办法是

  1. 渲染 Instancing Shading 的结果
  2. 将 DepthBuffer 设置为只读

Multiple Sample Texture

默认情况下主渲染窗口使用的是 Multiple Sampler 的 Texture,而一般使用的 Texture 并未开启 Multi-sample 模式。这会导致一些列的问题

  • 这两种方式下的互操作是非常复杂的(例如可以将 Multiple-Sample Texture 拷贝到 Texutre 当中,等等)。
  • 另外 Multiple Sampler Texture 在 HLSL Texture 当中操作是也和 Texture 不同,它对应的类型是 Texture2DMS

比较简单的做法是采用相同的配置渲染(都是 Multiple-Sampler),渲染结束后将其结果 copy 到 none-multiple-sampler 的 Texture 下,而后完成后续操作。

Using HLSL Function

通过 Texture 重建 normal, color, position 过程中可以使用 tex.Sample(PointSampler, transform(v.texcoord)) 读取 texture 的值,也可以通过 Texture.Load 函数来读取。通常 Texture.Load 读取的范围是 [0, width - 1][0, height - 1]。但当传入的函数是 SV_POSITION 且 Texture 的大小与 Render Target 相同时,此函数会自动进行转换,例如。

1
2
3
float4 psmain(Vertex v) : SV_TARGET {
float depth = depthmap.Load(int3(v.Position.xy, 0)).x;
}

此处经常会引起疑惑,因为 v.Position 的范围是 [-1, 1], 而 Load 是整形的。

Reference

No Reply at the moment.
You need to Sign in before reply, if you don't have an account, please Sign up first.