x01.Game.CubeRun: 風同樣的女子

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;
}
Cube.fx

其中,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 中下載。

相關文章
相關標籤/搜索