1.題解編程
小孩學英語比較有意思,Monkey three => 猴三,風同樣的女子 => 風 Girl。諸如此類不是重點,重點是一花一世界,一草一天堂。花花草草,紛紛擾擾。大千世界,當別具法眼。ide
2.HLSL函數
着色器語言,其實就是 C。形如 :POSITION 的語義指示,所指示者,寄存器而已。寫過操做系統的,就會明白,所謂的操做硬件,不過是操做硬件的寄存器罷了。HLSL,面向的是 GPU,操做的,固然是 GPU 的寄存器了。涉及到的特效文件 Cube.fx 內容以下:學習
//=========================== // Cube.fx (2013.12 by x01) //=========================== Texture2D texDiffuse : register(t0); SamplerState sampLinear : register(s0); cbuffer ConstantBuffer : register( b0 ) { matrix mWorld; matrix mView; matrix mProjection; float4 lightDirections[2]; float4 lightColors[2]; float4 outputColor; float4 meshColor; } struct VS_Input { float4 pos : POSITION; float3 normal : NORMAL; float2 tex : TEXCOORD0; }; struct PS_Input { float4 pos : SV_POSITION; float3 normal : NORMAL; float2 tex : TEXCOORD0; }; PS_Input VS_Main( VS_Input input ) { PS_Input output = (PS_Input)0; output.pos = mul( input.pos, mWorld ); output.pos = mul( output.pos, mView ); output.pos = mul( output.pos, mProjection ); output.normal = mul( input.normal, mWorld ); output.tex = input.tex; return output; } float4 PS_Main(PS_Input input) : SV_Target { float4 finalColor = 0; for (int i = 0; i < 2; i++) { finalColor += saturate( dot((float3)lightDirections[i], input.normal) * lightColors[i] ); } finalColor.a = 1; finalColor += texDiffuse.Sample(sampLinear, input.tex) * meshColor; return finalColor; } float4 PS_Solid(PS_Input input) : SV_Target { return outputColor; }
其中,ConstantBuffer 爲與程序代碼通訊之用。相關代碼(Cube.cpp 中)以下:ui
struct ConstantBuffer { XMMATRIX World; XMMATRIX View; XMMATRIX Projection; XMFLOAT4 LightDiretions[2]; XMFLOAT4 LightColors[2]; XMFLOAT4 OutputColor; XMFLOAT4 MeshColor; };
// Update Constant Buffer Variables ConstantBuffer cb1; cb1.World = XMMatrixTranspose(m_mWorld); cb1.View = XMMatrixTranspose(m_mView); cb1.Projection = XMMatrixTranspose(m_mProjection); cb1.LightDiretions[0] = lightDirections[0]; cb1.LightDiretions[1] = lightDirections[1]; cb1.LightColors[0] = lightColors[0]; cb1.LightColors[1] = lightColors[1]; cb1.OutputColor = XMFLOAT4(0.0f, 0.0f, 0.0f, 0.0f); cb1.MeshColor = m_MeshColor; m_pContext->UpdateSubresource(m_pConstantBuffer, 0, nullptr, &cb1, 0, 0);
不難看出,基本是一一對應的關係,調用 UpdateSubresource() 函數完成數據更新。spa
3.基本設置操作系統
運行 VS2012,新建 Win32 空項目 x01.Game.CubeRun,選擇菜單 VIEW =〉Other Windows =〉Property Manager,在 Manager 中,選擇 Microsoft.Cpp.Win32.user 進行設置。相關設置,可參看 Main.cpp 文件中的註釋。這樣,新建項目時,就不須要從新設置了。code
4.知識技巧orm
3D 遊戲編程,無外乎光照、紋理、座標變換。這些,DirectX SDK 文檔語之甚詳。除此以外,學習C++,推薦《C++ Primer》:細微之處,都講得很是清楚。向量和矩陣,也是題中應有之義,好在不難。blog
說到技巧,最大的技巧就是複製與粘貼。畢竟有現成的代碼可供參考,犯不上同本身較勁。而代碼,幾乎是公式化的東西,如註冊窗口類,建立窗口,建立設備和交換鏈,建立設備上下文,建立渲染目標視圖等等,都是能夠直接拿來用的。理解以後,可將 DX11Base.h, DX11Base.cpp, Main.cpp, Helper.h 複製到一個模板文件夾中以重用。這也大多數人的選擇。
在特效文件 Cube.fx 上右擊,選擇 Property 菜單,將 General =〉Item Type 內容設爲 Does not participate in build,不然,HLSL 編譯器會找不到 main 函數而報錯。
源代碼可到個人置頂博客 x01.Lab.Download 中下載。