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[];
float4 lightColors[];
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);
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 = ;
for (int i = ; i < ; i++)
{
finalColor += saturate( dot((float3)lightDirections[i], input.normal) * lightColors[i] );
}
finalColor.a = ; 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[];
XMFLOAT4 LightColors[];
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[] = lightDirections[];
cb1.LightDiretions[] = lightDirections[];
cb1.LightColors[] = lightColors[];
cb1.LightColors[] = lightColors[];
cb1.OutputColor = XMFLOAT4(0.0f, 0.0f, 0.0f, 0.0f);
cb1.MeshColor = m_MeshColor;
m_pContext->UpdateSubresource(m_pConstantBuffer, , nullptr, &cb1, , );
不难看出,基本是一一对应的关系,调用 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 中下载。
x01.Game.CubeRun: 风一样的女子的更多相关文章
- x01.Game.CubeRun: XACT3 播放声音
1.使用 Xact3 工具 在 DXSDK 安装目录 => Uilities => bin => x86 里,运行 Xact3.exe 程序,新建波形库(Wave Bank).声音库 ...
- [转载]Web 研发模式演变
原文链接:https://github.com/lifesinger/blog/issues/184 前不久徐飞写了一篇很好的文章:Web 应用的组件化开发.本文尝试从历史发展角度,说说各种研发模式的 ...
- 前端文摘:Web 开发模式演变历史和趋势
今天的<前端文摘>给大家分享一篇玉伯的文章.文章详细介绍了 Web 开发的四种常用模式以及未来可能成为流行趋势的 Node 全栈开发模式,相信你看了以后一定会有收获. 您可能感兴趣的相关文 ...
- Web 研发模式演变
前不久徐飞写了一篇很好的文章:Web 应用的组件化开发.本文尝试从历史发展角度,说说各种研发模式的优劣. 一.简单明快的早期时代 可称之为 Web 1.0 时代,非常适合创业型小项目,不分前后端,经常 ...
- js实现键盘操作对div的移动或改变-------Day43
<爸爸去哪儿>的第二季据说要开播了额,有点小期待,不知道这一季的小宝贝们会有多萌,还会甜到心底吧, 哈哈,还记得那个风一样的女子呢,不知道她如今怎样了. 言归正传,继续今天的记录,实际上在 ...
- Web 开发模式演变历史和趋势
前不久徐飞写了一篇很好的文章:Web 应用的组件化开发.本文尝试从历史发展角度,说说各种研发模式的优劣. 一.简单明快的早期时代 可称之为 Web 1.0 时代,非常适合创业型小项目,不分前后端,经常 ...
- [转] Web 开发模式演变历史和趋势
文章转自梦想天空--前端文摘:Web 开发模式演变历史和趋势 一.简单明快的早期时代 可称之为 Web 1.0 时代,非常适合创业型小项目,不分前后端,经常 3-5 人搞定所有开发.页面由 JSP.P ...
- Web 研发模式的演变
前不久徐飞写了一篇很好的文章:Web 应用的组件化开发.本文尝试从历史发展角度,说说各种研发模式的优劣. 一.简单明快的早期时代 可称之为 Web 1.0 时代,非常适合创业型小项目,不分前后端,经常 ...
- [Node.js] 00 - Where do we put Node.js
Ref: 前后端分离的思考与实践(五篇软文) 其实就是在吹淘宝自己的Midway-ModelProxy架构. 第一篇 起因 为了提升开发效率,前后端分离的需求越来越被重视, 同一份数据接口,我们可以定 ...
随机推荐
- java 克隆
1. About Java中, 对于基本数据类型可以使用"=" 来克隆,此时两个对象除了相等是没有任何关系的; 而对于引用类型, 却不能简单地使用"="来克隆, ...
- BZOJ 2467 解题报告
对于一个合格的程序员来说,掌握一定的数学知识是非常必要的,所以这次就开个数学专题玩玩. 不多说啥,上题目,我们直接分析题目! 首先ORZ stonepage神犇,一眼就看出我把快速幂写成快速乘了…… ...
- 利用Redis cache优化app查询速度实践
注意:本篇文章译自speeding up existing app with a redis cache,如需要转载请注明出处. 发现问题 在应用解决方法之前,我们需要对我们面对的问题有一个清晰的认识 ...
- Java经典实例:实现一个简单堆栈
堆栈(Stack)是一种常见的数据结构,符合后进先出(First In Last Out)原则,通常用于实现对象存放顺序的逆序.栈的基本操作有push(添加到堆栈),pop(从堆栈删除),peek(检 ...
- GJM : 用Unity模仿CSGO里的火焰效果 [转载]
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- 通过angularjs的directive以及service来实现的列表页加载排序分页
前两篇:(列表页的动态条件搜索,我是如何做列表页的)分别介绍了我们是如何做后端业务系统数据展示类的列表页以及动态搜索的,那么还剩下最重要的一项:数据展示.数据展示一般包含三部分: 数据列头 数据行 分 ...
- linux常用命令之压缩打包
DF df – report file system disk space usage 查看文件系统的使用清空 用法 df [-hi] [path] 选项 -h human readable ,以人类 ...
- .Net中的并行编程-5.流水线模型实战
自己在Excel整理了很多想写的话题,但苦于最近比较忙(其实这是借口).... 上篇文章<.Net中的并行编程-4.实现高性能异步队列>介绍了异步队列的实现,本篇文章介绍我实际工作者遇到了 ...
- JavaScript学习(1):基础
这篇文章里,我们来聊一些JavaScript的基础知识. 1. 如何运行JavaScript? JavaScript是一种解释型的语言,它不需要提前编译.通常情况下,JavaScript会放在网页中, ...
- Vue.js – 基于 MVVM 实现交互式的 Web 界面
Vue.js 是用于构建交互式的 Web 界面的库.它提供了 MVVM 数据绑定和一个可组合的组件系统,具有简单.灵活的 API.从技术上讲, Vue.js 集中在 MVVM 模式上的视图模型层,并 ...