1. 程式人生 > >Shader自動優化特性收錄

Shader自動優化特性收錄

 

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;
}

2. 等待繼續收錄