Shader自動優化特性收錄
阿新 • • 發佈:2018-11-19
1. 通過提供“暗示”,讓編譯器自動優化。
近日在研究Unity可程式設計渲染管線原始碼時,在Core庫的[email protected]\CoreRP\ShaderLibrary\Common.hlsl(446)發現了這樣一個小技巧,看一下下面這兩個例子:
struct VertexInput { float4 vertex : POSITION; }; struct VertexOutput { half4 pos : SV_POSITION; }; half Pow4(half x) { return (x * x) * (x * x); } VertexOutput Vertex(VertexInput i) { VertexOutput o; o.pos = Pow4(i.vertex.x); return o; } 上述Shader原始碼在編譯後實際只有2次乘法,編譯器自動執行了優化: 0: mul r0.x, v0.x, v0.x 1: mul o0.xyzw, r0.xxxx, r0.xxxx 2: ret
struct VertexInput { float4 vertex : POSITION; }; struct VertexOutput { half4 pos : SV_POSITION; }; half Pow4(half x) { return x * x * x * x; } VertexOutput Vertex(VertexInput i) { VertexOutput o; o.pos = Pow4(i.vertex.x); return o; } 如果Pow4中的3連乘不加括號,編譯器不會執行優化,編譯後會執行3次乘法。 0: mul r0.x, v0.x, v0.x 1: mul r0.x, r0.x, v0.x 2: mul o0.xyzw, r0.xxxx, v0.xxxx 3: ret
說明在編碼時給編譯器提供一些“暗示”,可以幫助編譯器執行自動優化,既保持了良好的可讀性,也達到了效能最優的目的。沒有必要按照傳統的方式進行手動優化,那樣程式碼的可讀性會略差一些:
// 沒有必要寫成這樣,因為結果完全一樣,但可讀性略差些。
half Pow4(half x)
{
half x2 = x * x;
return x2 * x2;
}