现在手机游戏特效软件开发中,做特效一般会用到哪些软件?

【图文】手机游戏项目开发介绍_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
手机游戏项目开发介绍
上传于||文档简介
&&简​要​介​绍​资​料​的​主​要​内​容​,​以​获​得​更​多​的​关​注
大小:209.50KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢flash,AE,U3D
游戏特效可分为以下两种:&br&1.ui特效:比如领取奖励、升级、扣/加hp金币之类的数值、loading等。&br&2.关卡内特效:战斗、角色升级等。&br&&br&无论哪种特效,一般都是采用引擎自带粒子和序列帧结合的方法。&br&2d特效一般运用photoshop绘制粒子元素或贴图,采用AE、3ds max来制作并渲染出png序列帧,有时需要导入ps中对部分帧进行修正。&br&3d特效一般比较依赖引擎的粒子编辑器,因此采用photoshop制作粒子贴图是主要工作,如果有特别精美的带有具体形态的粒子特效(比如火龙、水龙),还必须使用相应的3d模型,一般采用3ds max等三维软件建模。一些变化复杂的粒子贴图也会用到序列帧,制作工具和方法与2d特效相同。&br&&br&在2d引擎中采用序列帧会增加游戏容量,而纯用粒子效果就比较平淡,应根据不同需求结合应用。&br&3d引擎可以调节的参数相当多(unity的话可以写脚本对每个粒子进行独立的操控变化),纯粒子编辑器配合好的贴图也可以有很不俗的效果,序列帧和附加模型的需求比较小。
游戏特效可分为以下两种:1.ui特效:比如领取奖励、升级、扣/加hp金币之类的数值、loading等。2.关卡内特效:战斗、角色升级等。无论哪种特效,一般都是采用引擎自带粒子和序列帧结合的方法。2d特效一般运用photoshop绘制粒子元素或贴图,采用AE、3ds max来…
已有帐号?
无法登录?
社交帐号登录
浙大肄业的特效师推荐这篇日记的豆列
······
&(1人关注)游戏开发框架
Cocos2D-X是多平台开发中一个非常有用的库,它可以让你在创建自己的多平台游戏时节省很多的时间。支持的平台有Windows Phone,Windows 商店应用,iOS,Android。它具有很多的功能,比如sprite(精灵)扶持,非常酷的图形效果,动画效果,物理库,音频引擎等等。
Cocos2d-iPhone是基于 GNU LGPL
v3 license的,考虑到在iPhone的平台上无法实现发布第三方动态链接库,因此它扩展了上述协议,允许通过或者直接使用源代码的方式实现你的应用,而不必公开你的源代码。你不用担心这个开源引擎的效率和可能存在的内在限制,因为:在苹果AppStore上已经有超过100个游戏是基于Cocos2D-iPhone。其中3个由此进入过TOP 10的排名。其中的 StickWars更是曾排名第一。
Cocos2D-X是一个开源、免费的游戏开发引擎,也即游戏开发框架,可用于构建2D游戏、演示程序和其他图形界面的交互应用等。
control):非常容易地管理不同场景(scenes)之间的流程控制
精灵(Sprites):快速而方便的精灵
动作(Actions):告诉精灵们该做什么。可组合的动作如移动(move)、旋转(rotate)和缩放(scale)等更多
特效(Effects):特效包括(waves)、旋转(twirl)和透镜(lens)等更多
平面地图(Tiled Maps):支持包括矩形和六边形平面地图
转换(Transitions):从一个场景移动到另外一个不同风格的场景
(Menus):创建内部菜单
文本渲染(Text
Rendering):支持标签和标签动作
文档(Documents):编程指南 + API参考 + 视频教学 + 很多教你如何使用的简单测试例子
基于Pyglet:没有外部的依赖
基于OpenGL:支持
Phone 8 为
托管的应用 提供多个不同的项目模板,它们全部位于新建项目对话中
Templates-&Visual C#-& Windows Phone 或
Templates-&Visual Basic-& Windows Phone 下的 Visual
Studio 中。以下列表介绍
托管的应用 的一些功能。
应用模型 - 托管的应用 的应用模型与之前版本的
Windows&Phone 的模型几乎完全相同。您的应用程序将由一个主应用程序对象和一个或多个 PhoneApplicationPage 对象组成,它们全部用 XAML 和 C# 或 XAML 和 VB.NET 实现。每一个页面实现一个用户界面,用户在这些页面之间导航以访问应用程序的不同部分。
UI - 使用 XAML 定义 托管的应用 用户界面。Visual
Studio 和 Microsoft
Expression Blend 的内置设计器中有较大的可用控件库,它支持数据绑定,您可以轻松地对它进行布局。
独有功能 - 只有 托管的应用 可使用以下功能,仅限本机的应用程序无法使用。
浏览器控件
后台传输服务
Windows&Phone 广告控件
本地化资源
因为调用了托管运行时,因此启动时间可能稍慢一些,而且会使用少量额外内存。除 XAML 控件无效而需重绘的情况,与纯本机应用相比,可忽略 托管的应用 的性能下降。
可使用 XAML 提供完整 UI 以创建游戏。但是,也可以创建托管游戏,它使用 Direct3D 将 3D 图形呈现至屏幕。此类应用有两种特殊的项目模板。
2.1.1.1 XAML 和 Direct3D 项目模板
如果想在 XAML UI 内呈现 3D 图形,则建议使用该模板。该模板使用
DrawingSurface 控件在屏幕上显示 Direct3D 图形。DrawingSurface 与其他任何 XAML 控件一样,可以被放置在屏幕上的任何位置,在其他 XAML 控件上方或旁边都可以。在单独的 Windows
Phone 运行时
组件内实现通常用于呈现图形的
Direct3D 代码。
2.1.1.2 Direct3D 和 XAML 项目模板
如果想创建的游戏只将托管应用作为围绕实质上的本机游戏的精简包装使用,以便利用仅
托管的应用 可用的一些功能(如实时拼贴),则建议使用该模板。该模板使用 DrawingSurfaceBackgroundGrid 控件在屏幕上显示 Direct3D 图形。与 DrawingSurface 控件不同,该控件必须置于 XAML 树的根部,而且总是覆盖整个屏幕。与另一个模板一样,在单独的 Windows Phone
组件内实现用于呈现图形的
Direct3D 代码。Direct3D 和 XAML 应用的帧速率仅稍微优于 XAML 和 Direct3D 应用。
完全用本机代码编写 Direct3D 应用。一般的开发人员可能发现,开发 Direct3D 应用
比开发可比的 托管的应用 更具挑战性,因为必须使用本机代码从头实现 托管的应用 可用的许多功能(表现为可靠的高级托管 API
形式)。对于 UI 组件来说尤其如此,因为它们没有纯本机应用可用的预制按钮、列表或文本框控件(虽然第三方库可能提供这其中部分内容)。高级开发人员和以多个平台为目标的开发人员可能发现可以更轻松、更灵活地使用这种项目类型。以下是 Direct3D 应用 的一些功能。
项目模板 - 通过在新建项目对话中创建新项目并选择 Templates-&Visual
C++ 下的 Direct3D 应用程序项目模板,可以在
Visual Studio 中创建 Direct3D 应用。
应用模型 - Direct3D 应用 应用程序模型反映 Windows&8 设计原则。该模型使用 CoreApplication 对象,该对象管理应用程序生命周期事件,然后将它们分发至
IFrameworkView 界面的实现。该界面公开承载您的游戏循环的 Run 方法。在该模型中,没有内置的导航概念。您只需根据应用需要,拖至屏幕。
- Direct3D 应用
不支持 XAML 或任何内置控件。如果您的应用需要标准控件,如文本框、按钮或复选框,那么您需要从头编写它们,或使用第三方库。
托管 - 托管的应用 的 UI 框架(包含控件和页面导航)意味着应用程序开发更快速、更易用。对 Windows
Phone 运行时 库(DrawingSurface 控件)的访问让您可以使用 Direct3D 将图形呈现为 XAML 页面,而可以从托管代码调用本机程序集的能力意味着与仅限本机的应用相比,托管的应用
拥有相当的功能或性能。多个有用功能,如实时拼贴、后台传输服务和几个内置启动器和选择器,只能在 托管的应用 应用程序中使用。托管的应用 应用也将让您可以复用 Windows Phone OS 7.1 应用程序中的大多数代码。
Direct3D - Direct3D
应用 面向具有最高性能要求的应用,如复杂的 3D 游戏。没有内置控件或其他用户界面基元。纯本机应用程序更易于导至
Windows&8 本机应用程序和其他支持本机代码的平台。
有关创建 Direct3D 应用 的更多信息,请参见 Windows
Phone 8 的 Direct3D 应用开发。
2.2.1.1 Direct3D API
Phone 8 支持 DirectX 库中 API 的子集。最值得注意的是,Windows 映射处理组件 (WIC) 和 Direct2D 库完全不受支持。手机上支持的 API 在 9_3 功能级别上受支持,这意味着与支持更高功能级别的设备上运行的相同 API 相比,这些 API 有不同的表现。下面是一些示例,其中在使用 9_3 功能级别时,尤其是在为图形设备设置交换链时,API 在手机上的行为与其在桌面应用中的行为不同。有关手机上 Direct3D 的 API 差异的详细信息,请参见 Supported
Direct3D APIs for Windows Phone。
2.2.1.2 加载纹理
8 应用可以使用 WIC 以多种图像格式(如 PNG 文件)加载纹理。Windows Phone 不支持 WIC。面向手机的游戏应该使用 .dds 文件格式的纹理。
由于手机屏幕较小,建议您对手机游戏使用较小的纹理。这不会改进性能,但这能够使应用的 XAP 文件显著缩小且不会影响游戏的视觉保真度。
2.2.1.3 绘制 2-D 图形
应用可以使用 Direct2D 将 2-D 图形呈现到屏幕。呈现 GUI 组件(如,菜单和 HUD)就是典型的例子。面向手机的游戏应该使用 Direct3D 模拟二维 sprite 的行为,来绘制使用纹理的并与屏幕对齐的四边形。
2.2.1.4 输入
Phone 不支持游戏手柄或硬件键盘输入。使用 Windows 8 上用于鼠标输入的 PointerPressed、PointerReleased
和 PointerMoved 处理触控输入。
2.2.1.5 文本输入
在 Windows Phone 上,术语“Direct3D 应用”是指使用本机应用模型并且仅可调用本机代码的应用。此类型的应用不支持任何 XAML 控件,如用于文本输入的文本框。有一些帮助器功能允许本机应用从软件输入面板
(SIP) 键盘接收文本输入,以启用自定义生成的文本框。有关在本机应用中处理文本输入的更多信息,请参见如何在 Windows
Phone 8 的 Direct3D 应用中处理键盘输入。
2.2.1.6 后台音频
Phone 重新实现桌面上提供的 Microsoft 媒体基础 (MF) API 的子集。您应该使用 IMFMediaEngine 接口为游戏实现后台音频。有关手机上支持的 MF 接口的更多信息,请参见
演练:使用 Windows
Phone 8 的 Microsoft 媒体基础。
2.2.1.7 Windows Phone 8 的大理石迷宫示例
大理石迷宫是一款功能全面的游戏,是为说明 Windows 商店 应用的游戏开发而开发。有关如何开发该游戏的信息,请参见开发大理石迷宫。该应用已经被移植在 Windows Phone 8 上运行。若要下载示例和阅读为使之在 Windows Phone
上运行而做出的更改,请参见 Windows Phone 8 的大理石迷宫示例。
2.2.1.8 DirectX 工具包
工具包 (DirectXTK) 是用于编写 Direct3D 11 代码的帮助器类的集合。DirectXTK 既支持桌面开发,也支持手机开发,而且可以帮助您实现一些在手机上可能挑战性更强的常见方案,如加载纹理、二维绘制和呈现文本。该工具箱的功能包括:
1. SpriteBatch
- 简单而有效的 2-D sprite 呈现
2. SpriteFont
- 基于位图的文本呈现
3. Effects - 用于常见呈现任务的内置着色器集
4. PrimitiveBatch
- 简单而有效的绘制用户基元的方式
5. GeometricPrimitive
- 绘制基本形状,如立方体和球体。
6. CommonStates
- 提供常用的 Direct3D 状态对象的工厂
7. VertexTypes
- 用于常用的顶点数据格式的结构
8. DDSTextureLoader
- 轻量 DDS 文件纹理加载器
9. WICTextureLoader
- 基于 WIC 的图像文件纹理加载器(Windows&Phone&8 不支持它)
10.& ScreenGrab - 轻量屏幕快照保存器
有关 DirectXTK 的更多信息,请参见 CodePlex 上的项目页面。
功能级别 9_3 的支持
着色器型号
2.0 (4_0_level_9_3) [vs_2_a/ps_2_b]
几何图形着色器
并行计算 / 计算着色器
外壳和域着色器
纹理资源数组
立方体贴图资源数组
Alpha 至覆盖
扩展格式(如,BGRA)
10-位 XR 高颜色格式
逻辑操作(输出合并器)
独立于目标的光栅化
ForcedSampleCount1 的多个呈现目标 (MRT)
每个阶段的 UAV
仅限 UAV 呈现的最高强制采样计数
恒缓冲抵消和部分更新
位每像素 (bpp) 格式
最大纹理维度
最大立方体贴图维度
最大体积扩展
最大纹理重复
最大各向异性
最大基元计数
最大输入插槽
同步呈现目标
单独的 alpha 混合
顶点元素重叠
独立写入掩码
Nonpowers-of-2
对于功能级别 9_3,在两种条件下显示设备支持使用其维度不是 2 的幂的二维纹理。首先,仅可以为每个纹理创建一个 MIP-地图级别;第二,不允许纹理的包装采样器模式(即,不能将
D3D11_SAMPLER_DESC 的 AddressU、AddressV 和 AddressW
成员设置为
D3D11_TEXTURE_ADDRESS_WRAP)。
在 Windows
Phone 8 上,开发人员可以在使用 Direct3D 的应用中使用自定义顶点着色器和像素着色器。Windows&Phone&8
设备上的自定义着色器的受支持功能和限制由着色器模型
4_0_level_9_3 定义。有关着色器模型的更多信息,请参见着色器模型 vs. 着色器配置文件。
4_0_level_9_3
着色器模型包含 Direct3D
9-era 着色器模型 2.0 的所有功能,同时带有一些重要差异。
对于 DirectX,必须使用高级着色语言编写着色器。有关更多信息,请参见 HLSL。
支持静态和动态流控制。
顶点着色器在长度上可能相当于 256 个相等的着色器汇编程序指令。
像素着色器在长度上可能相当于 512 个相等的着色器汇编程序指令。
是为编写 GPU 着色器代码而优化的像 C 一样的编程语言。当用 HLSL 为
Windows&Phone&8 应用编写着色器代码时,您应考虑以下内容:
必须使用 FXC.exe(效果编译器工具)脱机编译着色器代码。Visual Studio 默认使用它,也可以从命令行调用它。不支持运行时着色器编译。
4_0_level_9_3
的着色器编译器目标是针对顶点着色器的 vs_4_0_level_9_3 和针对像素着色器的 ps_4_0_level_9_3。有关着色器编译器目标的更多信息,请参见指定编译器目标。
4_0_level_9_3
着色器模型的语义与为 Direct3D 9 编写的语义相同,因此大多数系统价值语义(通过 Direct3D
10 和着色器模型 4.0 引入)都不可用。SV_Position、SV_Target 和 SV_Depth 是例外,它们都受支持。有关语义的更多信息,包括系统价值语义,请参见语义。
在编写可能接近指令计数限制的较大着色器的情况下,当编译着色器以获取和检查产生的汇编程序代码输出时,您可以使用“/Fc”进行切换。有关效果编译器工具的命令行选项的更多信息,请参见语法。
2.2.4.1 创建 Direct3D 设备
ID3D11Device 是
Direct3D 开发的重要界面。它用于创建您将用到的大多数其他图形资源,如纹理、顶点缓冲区和着色器。创建该设备的代码位于 Direct3Dbase 类的 CreateDeviceResources 方法中的 Direct3D 应用项目模板内。
D3D_FEATURE_LEVEL featureLevels[] =
D3D_FEATURE_LEVEL_11_1,
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0,
D3D_FEATURE_LEVEL_9_3
// Create the Direct3D 11 API device object and a corresponding context.
DX::ThrowIfFailed(
D3D11CreateDevice(
nullptr, // Specify nullptr to use the default adapter.
D3D_DRIVER_TYPE_HARDWARE,
creationFlags, // Set set debug and Direct2D compatibility flags.
featureLevels, // List of feature levels this app can support.
ARRAYSIZE(featureLevels),
D3D11_SDK_VERSION, // Always set this to D3D11_SDK_VERSION.
&device, // Returns the Direct3D device created.
&m_featureLevel, // Returns feature level of device created.
&context // Returns the device immediate context.
// Get the Direct3D 11.1 API device and context interfaces.
DX::ThrowIfFailed(
device.As(&m_d3dDevice)
DX::ThrowIfFailed(
context.As(&m_d3dContext)
请注意,featureLevels 数组包含的常数列表代表特定设备可能支持的不同设备功能级别。对 CreateD3D11Device 的调用将为当前设备所支持的数组中的第一个功能级别创建设备。Windows&Phone 仅支持功能级别 9_3,因此这是在物理设备上运行时,唯一会被返回的设备。但是,Windows Phone 8 模拟器 可能允许创建功能级别更高的设备。不论您是在设备上还是模拟器上运行应用,为了确保您用正确的功能级别测试应用,建议您更新代码,以便只请求功能级别 9_3。要实现这一点,则将 featureLevels 数组更改为如下所示。
D3D_FEATURE_LEVEL featureLevels[] =
D3D_FEATURE_LEVEL_9_3
有关功能级别 9_3 支持的更多信息,请参见Windows
Phone 8 的 Direct3D 功能级别
2.2.4.2 创建交换链
应用使用交换链将后台缓冲区的内容复制到屏幕。使用
IDXGIFactory2 接口创建交换链。手机仅支持该接口公开的方法的子集。有关受支持的 API 的完整列表,请参见 Supported
Direct3D APIs for Windows Phone。
除了一些 DXGI 方法在手机上完全不可用的事实之外,Windows&Phone&8
上的 DXGI 也展现出受支持的 API 的一些关键差异,主要涉及交换链的创建及其相关后台缓冲区与 IDXGIFactory2::CreateSwapChainForCoreWindow 之间的内容。以下列表指出这些关键差异:
1. DXGI_SWAP_CHAIN_DESC1.Format
- 在 Windows&Phone&8 上,唯一支持的显示格式是
DXGI_FORMAT_B8G8R8A8_UNORM。
2. DXGI_SWAP_CHAIN_DESC1.BufferCount
- 在 Windows&Phone&8 上,交换链的缓冲区数必须为 1。如果指定的值大于 1,DXGI 将默认为 1。
3. DXGI_SWAP_CHAIN_DESC1.SwapEffect
- 在 Windows&Phone&8 上,唯一支持的交换效果是
DXGI_SWAP_EFFECT_DISCARD。这意味着,DXGI 将不会在表示之后保留后台缓冲区的内容。
4. DXGI_SWAP_CHAIN_DESC1.Scaling
- 在 Windows&Phone&8 上,支持的缩放模式仅有
DXGI_SCALING_STRETCH 和 DXGI_SCALING_ASPECT_RATIO_STRETCH。当后台缓冲区的大小与目标输出不相等时,DXGI_SCALING_STRETCH 将缩放后台缓冲区内容,使之适合目标输出(不考虑纵横比),而 DXGI_SCALING_ASPECT_RATIO_STRETCH 将根据需要执行纵横比保留缩放和 letterbox 内容。
以下代码显示 Direct3D 应用项目模板中的交换链创建。
m_windowBounds = m_window->B
// Calculate the necessary swap chain and render target size in pixels.
m_renderTargetSize.Width = ConvertDipsToPixels(m_windowBounds.Width);
m_renderTargetSize.Height = ConvertDipsToPixels(m_windowBounds.Height);
DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0};
swapChainDesc.Width = static_cast(m_renderTargetSize.Width); // Match the size of the window.
swapChainDesc.Height = static_cast(m_renderTargetSize.Height);
swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; // This is the most common swap chain format.
swapChainDesc.Stereo =
swapChainDesc.SampleDesc.Count = 1; // Don't use multi-sampling.
swapChainDesc.SampleDesc.Quality = 0;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.BufferCount = 1; // On phone, only single buffering is supported.
swapChainDesc.Scaling = DXGI_SCALING_STRETCH; // On phone, only stretch and aspect-ratio stretch scaling are allowed.
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; // On phone, no swap effects are supported.
swapChainDesc.Flags = 0;
ComPtr dxgiD
DX::ThrowIfFailed(
m_d3dDevice.As(&dxgiDevice)
ComPtr dxgiA
DX::ThrowIfFailed(
dxgiDevice->GetAdapter(&dxgiAdapter)
ComPtr dxgiF
DX::ThrowIfFailed(
dxgiAdapter->GetParent(
__uuidof(IDXGIFactory2),
&dxgiFactory
Windows::UI::Core::CoreWindow^ window = m_window.Get();
DX::ThrowIfFailed(
dxgiFactory->CreateSwapChainForCoreWindow(
m_d3dDevice.Get(),
reinterpret_cast(window),
&swapChainDesc,
nullptr, // Allow on all displays.
&m_swapChain
Phone 8 在后台缓冲区图面上不支持多示例抗锯齿 (MSAA)。该限制在所有的 Windows Phone 8 应用程序和所有的 Windows 商店 应用程序中都存在。如果您在 Windows Phone 启用 MSAA 的情况下,尝试创建交换链,那么 DXGI 将返回 DXGI_ERROR_INVALID_CALL。
但是,因为该限制仅适用于后台缓冲区,而不适用于常规的屏幕外呈现目标,所以使用次级呈现目标来为您的应用程序启用 MSAA 仍有可能。为此,您必须执行下列步骤:
1. 在启用了多重采样和设置了呈现目标绑定标志的情况下,创建新的
ID3D11Texture2D。这是您的屏幕外呈现目标纹理。
2. 为您新建的呈现目标纹理创建 ID3D11RenderTargetView。
3. 将您的场景绘制至您的呈现目标。
4. 将您的呈现目标作为源,将后台缓冲区作为目的地,调用
ID3D11DeviceContext::ResolveSubresource。
请注意,并非所有纹理格式都支持 MSAA。关于在功能级别 9_3 设备(如 Windows&Phone)上支持多示例抗锯齿的呈现目标格式列表,请参见 Direct3D
10Level9 格式的硬件支持。
2.2.5.1 修改 Direct3D 应用项目模板以使用抗锯齿
以下步骤向您演示如何使用屏幕外缓冲区修改包括在 Windows Phone SDK 8.0 中的 Direct3D 应用模板,以支持抗锯齿。
首先,在 Direct3Dbase.h 中声明新的 Texture2D 的变量,把它们作为屏幕外缓冲区,同时声明 RenderTargetView,使用纹理作为呈现对象时需要用它。另外,创建成员变量以存储主要后台缓冲区。在默认模板中,该变量是本地的,将会超出范围,但是在这种情况,我们以后需要引用它。
Microsoft::WRL::ComPtr m_backB
Microsoft::WRL::ComPtr m_offscreenRenderT
Microsoft::WRL::ComPtr m_offscreenRenderTargetV
在 Direct3Dbase.cpp 中,在
CreateWindowSizeDependentResources 方法的底部,添加以下代码以创建呈现目标和呈现目标视图。将 desc.SampleDesc.Count 设置为 4,则将通过 4x 多重取样创建纹理。
CD3D11_TEXTURE2D_DESC desc(DXGI_FORMAT_B8G8R8A8_UNORM, m_renderTargetSize.Width, m_renderTargetSize.Height, 1, 1);
desc.BindFlags = D3D11_BIND_RENDER_TARGET;
desc.SampleDesc.Count = 4; // 4x MSAA
DX::ThrowIfFailed(
m_d3dDevice->CreateTexture2D(
&m_offscreenRenderTarget
DX::ThrowIfFailed(
m_d3dDevice->CreateRenderTargetView(
m_offscreenRenderTarget.Get(),
&m_offscreenRenderTargetView
接下来在 CreateWindowSizeDependentResources 中,您应对通过与呈现目标相同的多重取样级别而创建深度模板的代码进行修改。在本代码中,默认模板中被更改的行是 depthStencilDesc.SampleDesc.Count 设置为 4 的行和使用 D3D11_DSV_DIMENSION_TEXTURE2DMS 常量初始化
depthStencilViewDesc 变量的行。模板默认使用不启用多重取样的
D3D11_DSV_DIMENSION_TEXTURE2D
// Create a depth stencil view.
CD3D11_TEXTURE2D_DESC depthStencilDesc(
DXGI_FORMAT_D24_UNORM_S8_UINT,
static_cast(m_renderTargetSize.Width),
static_cast(m_renderTargetSize.Height),
D3D11_BIND_DEPTH_STENCIL
depthStencilDesc.SampleDesc.Count = 4; // 4x MSAA
ComPtr depthS
DX::ThrowIfFailed(
m_d3dDevice->CreateTexture2D(
&depthStencilDesc,
&depthStencil
CD3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc(D3D11_DSV_DIMENSION_TEXTURE2DMS);
DX::ThrowIfFailed(
m_d3dDevice->CreateDepthStencilView(
depthStencil.Get(),
&depthStencilViewDesc,
&m_depthStencilView
同样在 CreateWindowSizeDependentResources 中,您需要更新创建了后台缓冲区的代码,以使用 m_backBuffer 成员变量而非模板中使用的本地后台缓冲区变量。
// Create a render target view of the swap chain back buffer.
DX::ThrowIfFailed(
m_swapChain->GetBuffer(
__uuidof(ID3D11Texture2D),
&m_backBuffer
DX::ThrowIfFailed(
m_d3dDevice->CreateRenderTargetView(
m_backBuffer.Get(),
&m_renderTargetView
现在,只剩下修改 CubeRenderer.cpp 中的“呈现”方法,以使用屏幕外的呈现目标。在该方法的顶部,添加以下代码以设置呈现目标。
const float midnightBlue[] = { 0.098f, 0.098f, 0.439f, 1.000f };
m_d3dContext->ClearRenderTargetView(
m_offscreenRenderTargetView.Get(),
midnightBlue
m_d3dContext->OMSetRenderTargets(
m_offscreenRenderTargetView.GetAddressOf(),
m_depthStencilView.Get()
最后,在“呈现”方法的末尾,调用 ResolveSubresources 以便将呈现目标的内容复制到后台缓冲区。
m_d3dContext->ResolveSubresource(
m_backBuffer.Get(),
m_offscreenRenderTarget.Get(),
DXGI_FORMAT_B8G8R8A8_UNORM);
Phone 8 设备使用的 GPU 利用基于图块的呈现方法。该呈现方法针对非常占用内存的呈现操作利用内部图块缓存,避免否则会需要到的许多片外内存交易,力图提高 GPU 性能和减少耗电量。从概念上说,基于图块的呈现涉及将呈现目标划分为图块缓存大小的块,即图块,而且要多次重播定向在呈现目标的呈现命令,每次一个图块。基于图块的 GPU 的驱动程序可以敏捷地确定在给定图块上需要呈现哪些顶点,在必要的地方剪裁三角形和线段,以及使用“binning”进程。但是,对于该驱动程序来说,为含有多重或复合呈现目标的应用程序方案优化图块呈现的挑战性更大,这主要因为它并不一定知道应用程序何时完成当前呈现目标的图块。在默认情况下,移至新的呈现目标图块时,驱动程序将保留图块内容,即在加载下一个图块之前将此图块解析回至内存,这可能引起不必要的内存开销。
基于图块的 GPU 的图块缓存结构得到高度优化,以便非常高效地从事缓存内图形内存交易。例如,Alpha
混合实际上有意不占用基于图块的 GPU,而如果使用传统 GPU,则会因所需的与外部图像内存之间的读-修改-写交易而产生额外开销。类似地,多示例抗锯齿 (MSAA) 呈现目标对基于图块的 GPU 的开销大大小于对传统 GPU 的,这仍然得益于经优化的图块缓存结构。
Direct3D11
(D3D 11) 包含一些 API,这些 API 让应用程序能够向
GPU 驱动程序提供提示,帮助驱动程序避免与图块相关的不必要内存交易。在以下部分,将在常见应用程序方案和基于图块的呈现上下文中解释现有的和新的 D3D 11.1 GPU 提示 API。
2.2.6.1 避免中途切换呈现目标
通常,为了避免不必要的图块解析和涉及的性能损失,采用多个呈现目标的应用程序应在为给定场景处理完一个呈现目标后再处理下一个。例如,采用一个或多个屏幕外呈现目标(在为当前帧呈现缓冲区时对呈现目标生成的纹理进行采样)的应用,应在向后备缓冲区呈现之前完成每一个纹理的呈现。
2.2.6.2 避免“增量呈现”
对于要组合多个纹理层的应用程序方案,应避免增量合并,以避免“增量呈现”,“增量呈现”涉及会损害性能的不必要的外部内存交易和不必要的 D3D11 调用。例如,考虑一下增量合并 4 个纹理层而不是推迟合并的后果:
1.& 设置呈现对象 A、清理 A、绘制至 A
2.& 设置呈现对象 B、清理 B、绘制至 B
3.& 设置呈现对象 C、清理 C、绘制至 C
4.& 设置呈现对象 D、清理 D、使用 A、B 和 C 绘制至 D
该方法需要 4 个调用来设置呈现目标。
1.& 设置呈现对象 A、清理 A、绘制至 A
2.& 设置呈现对象 D、清理 D、将 A 绘制至 D
3.& 设置呈现对象 B、清理 B、绘制至 B
4.& 设置呈现对象 D,将 B 绘制至 D
5.& 设置呈现对象 C、清理 C、绘制至 C
6.& 设置呈现对象 D,将 C 绘制至 D
该方法需要 6 个调用来设置呈现目标。
在以上所演示的首选方法中,请注意,切换至每一个呈现对象之后立即调用 Clear。这向 GPU 驱动程序指示,给定呈现对象不需要“增量呈现”,即不必在呈现之前读取每一个呈现目标图块。请在下一节中参阅 Clear 的替换项。在低效方法示例中,除了要更多地调用
OMSetRenderTarget,呈现目标 D 的图块还必须多次读回至内存。
2.2.6.3 避免不必要的清理
如果在一些方案中,应用程序提前知道现有呈现目标资源中的每一个像素都将被替代,即后续呈现操作中不需要它们,则两个新的“Discard”方法已被添加至 D3D 11.1,使之可以向 GPU 驱动程序指示该情况。以前该应用程序在此方案中有两个替换选项:
1. 在不清理的情况下绘制场景,这对于基于图块的 GPU 开销较大,因为 GPU 必须还原每一个图块,即在绘制前将每一个图块读入图块缓存中。显然,如果应用程序将不使用之前的内容,那么这些还原意味着大量的不必要开销。
2. 绘制前清理,这允许驱动程序避免还原图块,但却要求呈现目标写入操作执行 Clear 命令。同样,如果应用程序将不使用之前的内容,这些都不必要。
新的 D3D 11.1 Discard 方法为应用程序提供更有效的第三种选择,如下表所示:
ID3D11DeviceContext1::DiscardResource
不再定义向 GPU 指示资源当前内容和所有视图的信号,而且不需要在后续呈现通道上保留这些信号。
ID3D11DeviceContext1::DiscardView
从本质上说是与 DiscardResource 相同的操作,但是限定在特定的呈现目标视图中。
请注意,一旦应用程序在呈现目标资源或视图上调用了 Discard,则 Draw 调用将在每个正被更新的像素中遵循该结果。Discard 之后的呈现目标内容未被定义,因此应用程序无法在它们上面执行 Alpha 混合或仅仅绘制被覆盖形状的部分。
2.2.6.4 避免不必要的中途刷新
中途调用 ID3D11DeviceContext::Flush 可能导致过早的图块解析,进而导致不必要的图块读取。有关更多信息,请参见
ID3D11DeviceContext::Flush 参考主题中的“备注”一节。
2.2.6.5 复制和更新时使用提示
如果应用提前知道只有限定范围的呈现目标部分将为给定场景更新,则应用应使用
ID3D11DeviceContext::RSSetScissorRects 方法,使
GPU 驱动程序可以提前确定哪些图块不需要处理。
另两篇文章:
其它微软站点}

我要回帖

更多关于 手机游戏软件开发培训 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信