長期以來,GPU 作為電腦上另一顆可編程高效能晶片,因編程門檻高、工具鏈不完善而被一般程式開發者忽視。本文以 DirectX 9 / Shader Model 2.0 為基礎,實戰演示如何將「公告板」與「鎖鏈閃電」等幾何運算完全移至 Vertex Shader,釋放 CPU 算力。
以鎖鏈特效為例:法師施法產生連接多個目標的鎖鏈,每段為一個四邊形,需永遠面向攝影機(公告板效果)。傳統做法在 CPU 計算每幀所有頂點座標並旋轉;改良策略:
POSITION0:儲存段中點座標 PmidTEXCOORD0 (UV):y==0 向後展開,y!=0 向前;x==0 左,x==1 右TEXCOORD1:鎖鏈切向量 LeashY(單位向量)TEXCOORD2:四邊形半寬/半高 Sizefloat3 RotatedLeashY = normalize(mul(In.LeashY, WorldRotateMatrix));
float3 LeashX = normalize(cross(g_CameraPos - VertexWorldPos, RotatedLeashY));
float3 ExtendY = In.Size.y * RotatedLeashY;
float3 ExtendX = In.Size.x * LeashX;
if (In.UV0.y == 0) {
DealedPos = (In.UV0.x == 0) ? -ExtendY - ExtendX : -ExtendY + ExtendX;
} else {
DealedPos = (In.UV0.x == 0) ? ExtendY - ExtendX : ExtendY + ExtendX;
}
Out.ProjPos = mul(float4(VertexWorldPos + DealedPos, 1), g_ViewProjMatrix);
Size,實現鎖鏈拉長、抖動效果可編程管線出現前,這類運算只能在 CPU 完成。今朝 SM2.0 即可將公告板旋轉、鎖鏈幾何完全顯卡化;配合更新世代 Shader Model,GPU 早已超越「繪圖」角色,成為通用平行運算核心。遊戲開發者應主動識別「資料平行、邏輯固定」的幾何/數學運算,果斷下放至 GPU。