HLSL 本質是面向 GPU 的 C 方言,:POSITION 等語義標記對應硬件寄存器,操作著色器即操作 GPU 寄存器。
Cube.fx 核心結構cbuffer ConstantBuffer : register(b0) {
float4 lightDirections[4];
float4 lightColors[4];
float4 ambientColor;
float4 diffuseColor;
// ... 矩陣變換參數
};
struct VS_INPUT { float4 Pos : POSITION; float3 Normal : NORMAL; float2 Tex : TEXCOORD; };
struct PS_INPUT { float4 Pos : SV_POSITION; float3 Normal : NORMAL; float2 Tex : TEXCOORD; };
PS_INPUT VS_Main(VS_INPUT input) { /* 頂點變換 */ }
float4 PS_Main(PS_INPUT input) : SV_TARGET {
// 光照計算:環境光 + 多方向光漫反射 + 紋理採樣
float3 color = ambientColor;
for (int i=0; i<4; ++i)
color += saturate(dot(lightDirections[i], input.Normal)) * lightColors[i];
return texDiffuse.Sample(sampLinear, input.Tex) * color;
}
struct CB_NEVER_CHANGES { XMFLOAT4 lightDir[4]; XMFLOAT4 lightColor[4]; };
CB_NEVER_CHANGES cb1;
cb1.lightDir[0] = XMFLOAT4(-0.5f, 0.5f, -0.5f, 0.0f);
// ... 填充其餘數據
context->UpdateSubresource(_constantBuffer, 0, nullptr, &cb1, 0, 0);
一一對應原則:C++ 結構體佈局必須與 HLSL cbuffer 完全一致(對齊、順序、類型)。
Microsoft.Cpp.Win32.user 統一屬性表Cube.fx 屬性 → General → Item Type = "Does not participate in build",避免 HLSL 編譯器尋找 main 入口報錯DX11Base.h/cpp, Main.cpp, Helper.h)可復用於新專案置頂博客 x01.Lab.Download 提供完整工程源碼。