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

1.运行效果图

                          

代码下载链接:http://pan.baidu.com/share/link?uk=487566707&shareid=2537456843#dir/path=%2Fcode

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

struct ConstantBuffer
{
	XMMATRIX World;
	XMMATRIX View;
	XMMATRIX Projection;
	XMFLOAT4 LightDiretions[2];
	XMFLOAT4 LightColors[2];
	XMFLOAT4 OutputColor;
	XMFLOAT4 MeshColor;
};
        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 函数而出错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值