• x01.Game.CubeRun: 风一样的女子


    1.题解

    小孩学英语比较有意思,Monkey three => 猴三,风一样的女子 => 风 Girl。诸如此类不是重点,重点是一花一世界,一草一天堂。花花草草,纷纷扰扰。大千世界,当别具法眼。

    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 中)如下:

    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() 函数完成数据更新。

    3.基本设置

    运行 VS2012,新建 Win32 空项目 x01.Game.CubeRun,选择菜单 VIEW =〉Other Windows =〉Property Manager,在 Manager 中,选择 Microsoft.Cpp.Win32.user 进行设置。相关设置,可参看 Main.cpp 文件中的注释。这样,新建项目时,就不需要重新设置了。

    4.知识技巧

    3D 游戏编程,无外乎光照、纹理、坐标变换。这些,DirectX SDK 文档语之甚详。除此之外,学习C++,推荐《C++ Primer》:细微之处,都讲得非常清楚。向量和矩阵,也是题中应有之义,好在不难。

    说到技巧,最大的技巧就是复制与粘贴。毕竟有现成的代码可供参考,犯不上同自己较劲。而代码,几乎是公式化的东西,如注册窗口类,创建窗口,创建设备和交换链,创建设备上下文,创建渲染目标视图等等,都是可以直接拿来用的。理解之后,可将 DX11Base.h, DX11Base.cpp, Main.cpp, Helper.h 复制到一个模板文件夹中以重用。这也大多数人的选择。

    在特效文件 Cube.fx 上右击,选择 Property 菜单,将 General =〉Item Type 内容设为 Does not participate in build,否则,HLSL 编译器会找不到 main 函数而报错。

    源代码可到我的置顶博客 x01.Lab.Download 中下载。

  • 相关阅读:
    poj_1323 Game Prediction 贪心
    hdu_2391 Filthy Rich DP
    hdu_2570 迷障 贪心
    23种设计模式——结构型设计模式(7种)
    23种设计模式——创建型设计模式(5种)
    面向对象设计原则
    Android Studio常用配置
    [转]探索 Android 内存优化方法
    Java内存管理机制
    JNI与NDK简析(一)
  • 原文地址:https://www.cnblogs.com/china_x01/p/3486558.html
Copyright © 2020-2023  润新知