如果你移植 iOS 或 Android 平台中的游戏,那么你可能需要在 OpenGL ES 2.0 方面进行大量投资。如果你准备将你的图形管道代码库移动到 Direct3D 11 和 Windows 运行时,那么在开始之前你应该考虑以下事项。


大多数移植工作

通常涉及初始浏览该代码库,然后在两个模型之间映射常用的 API 和模式。你会发现,如果你花一段时间来阅读和查看该主题,那么这个过程就会变得容易一些。


下面是将图形从 OpenGL ES 2.0 移植到 Direct3D 11 时要注意的一些事项。

有关特定 OpenGL ES 2.0 提供商的说明


本部分中的移植主题参考了由 Khronos Group 创建的 OpenGL ES 2.0 规范的 Windows 实现。所有 OpenGL ES 2.0 代码示例都是使用 Visual Studio 2012 和 Windows C 基本语法开发的。如果你使用的是 Objective-C (iOS) 或 Java (Android) 代码库,那么请注意,所提供的 OpenGL ES 2.0 代码示例可能没有使用类似的 API 调用语法或参数。本指南尽量保持与平台无关。


本文档对 OpenGL ES 代码和参考仅使用 2.0 规范 API。如果是从 OpenGL ES 1.1 或 3.0 进行移植,那么该内容仍然有用,但是某些 OpenGL ES 2.0 代码示例和上下文可能不太熟悉。


这些主题中的 Direct3D 11 示例使用具有组件扩展 (CX) 的 Microsoft Windows C++。有关此版本的 C++ 语法的详细信息,请阅读 Visual C++运行时平台的组件扩展以及快速参考 (C++\CX)


了解硬件要求和资源


OpenGL ES 2.0 所支持的图形处理功能集大致映射到 Direct3D 9.1 中提供的功能。如果你想利用 Direct3D 11 中提供的更高级的功能,请在规划移植时查看 Direct3D 11 文档,或在完成初始工作之后查看从 DirectX 9 移植到 Windows 应用商店主题。


若要使你的初始移植工作更简单,请从 Visual Studio Direct3D 模板开始。该模板为你提供已配置好的基本呈现器,并且支持 Windows 应用商店应用功能(如在窗口更改时重新创建资源)以及 Direct3D 功能级别。


了解 Direct3D 功能级别


Direct3D 11 为 11_1 提供对 9_1 (Direct3D 9.1) 的硬件“功能级别”的支持。这些功能级别指示某些图形功能和资源的可用性。通常,大多数 OpenGL ES 2.0 平台都支持一组 Direct3D 9.1(功能级别 9_1)功能。


而且还因为 Windows RT 设备不要求支持高于 9_1 的功能级别,所以面向 Windows RT 体系结构的 Direct3D 应用必须定位到功能级别 9_1。为获得最广的受众,请为你的游戏和应用定位 9_1 功能集作为所有 CPU 体系结构的基线。如果你想在移植中利用更高级别的功能,请定位到 11_1。


有关 Direct3D 功能级别的详细信息,请阅读针对不同的 Direct3D 功能级别进行开发


查看 DirectX 图形功能和 API























API 系列 描述
DXGI DirectX 图形基础结构 (DXGI) 提供图形硬件和 Direct3D 之间的接口。它使用 IDXGIAdapterIDXGIDevice1 COM 接口设置设备适配器和硬件配置。使用它来创建和配置你的缓冲区以及其他窗口资源。值得注意的是,IDXGIFactory2 工厂模式 iis 用来获取图形资源,包括交换链(一组帧缓冲区)。由于 DXGI 拥有交换链,因此 IDXGISwapChain1 接口用来向屏幕提供帧。
Direct3D Direct3D 是一组 API,这些 API 提供图形接口的视觉表示并且允许你使用它绘制图形。当前版本是 11,它随 Windows 8 一起提供。在功能方面,它大致能够与 OpenGL 4.3 相媲美。(另一方面,尽管 OpenGL ES 2.0 与 DirectX9 和 OpenGL 2.0 在功能方面非常相似,但 OpenGL 3.0 具有统一的着色器管道。)大多数繁重的工作是通过 ID3D11Device1 和 ID3D11DeviceContext1 接口完成的,这两个接口分别提供对各个资源和子资源以及呈现上下文的访问。
Direct2D Direct2D 提供一组用于 GPU 加速 2D 呈现的 API。在作用方面,它与 OpenVG 非常相似。
DirectWrite DirectWrite 提供一组用于 GPU 加速高质量字体呈现的 API。
DirectXMath DirectXMath 提供一组 API 和宏,用于处理常见的线性代数和三角函数类型、值以及函数。这些类型和函数设计为与 Direct3D 及其着色器操作很好地结合使用。
DirectX HLSL Direct3D 着色器使用的当前 HLSL 语法。它实现 Direct3D 着色器模型 5.0。

查看 Windows 运行时 API 和模板库


Windows 运行时 API 为 Windows 应用商店应用提供整体基础结构。 在此处进行查看。


移植图形管道时使用的主要 Windows 运行时 API 包括:



此外,Windows 运行时 C++ 模板库 (WRL) 是提供创作和使用 Windows 运行时组件的低级方法的模板库。最好将 Windows 应用商店应用的 Direct3D 11 API 与该库中的接口和类型结合使用,如智能指针 (ComPtr)。有关 WRL 的详细信息,请阅读 Windows 运行时 C++ 模板库(WRL)


更改坐标系


有时容易让移植工作混乱的一个不同之处是要将 OpenGL 的传统右手坐标系更改为 Direct3D 默认的左手坐标系。坐标模型方面的这个更改会影响游戏的很多部分,从顶点缓冲区的设置和配置到很多矩阵数学函数。需要进行两个最重要的更改是:


  • 调换三角形顶点的顺序以便 Direct3D 从前面按顺时针方向遍历它们。例如,如果你的顶点在 OpenGL 管道中的索引为 0、1 和 2,则会按照 0、2、1 的顺序将它们传递给 Direct3D。

  • 使用视图矩阵将世界空间在 z 方向缩放 -1.0f,从而有效地反转 z 轴坐标。为此,请在视图矩阵中将 M31、M32 以及 M33 位置处的值的符号反向(当将其移植到 Matrix 类型时)。如果 M34 不为 0,则也要将它的符号反向。

但是,Direct3D 可以支持右手坐标系。DirectXMath 提供了很多可以在左手和右手坐标系上操作以及跨两个坐标系操作的函数。这些函数可以用来保存某些原始网格数据和矩阵处理。其中包括:















































DirectXMath 矩阵函数 描述
XMMatrixLookAtLH 使用一个相机位置、一个向上的方向和一个焦点为左手坐标系构建一个视图矩阵。
XMMatrixLookAtRH 使用一个相机位置、一个向上的方向和一个焦点为右手坐标系构建一个视图矩阵。
XMMatrixLookToLH 使用一个相机位置、一个向上的方向和一个相机方向为左手坐标系构建一个视图矩阵。
XMMatrixLookToRH 使用一个相机位置、一个向上的方向和一个相机方向为右手坐标系构建一个视图矩阵。
XMMatrixOrthographicLH 为左手坐标系构建一个正交投影矩阵。
XMMatrixOrthographicOffCenterLH 为左手坐标系构建一个自定义正交投影矩阵。
XMMatrixOrthographicOffCenterRH 为右手坐标系构建一个自定义正交投影矩阵。
XMMatrixOrthographicRH 为右手坐标系构建一个正交投影矩阵。
XMMatrixPerspectiveFovLH 根据视野构建一个左手透视投影矩阵。
XMMatrixPerspectiveFovRH 根据视野构建一个右手透视投影矩阵。
XMMatrixPerspectiveLH 构建一个左手透视投影矩阵。
XMMatrixPerspectiveOffCenterLH 构建一个自定义版本的左手透视投影矩阵。
XMMatrixPerspectiveOffCenterRH 构建一个自定义版本的右手透视投影矩阵。
XMMatrixPerspectiveRH 构建一个右手透视投影矩阵。

OpenGL ES2.0 到 Direct3D 11 移植常见问题解答


    • 问题:“通常情况下,我可以在我的 OpenGL 代码中搜索某些字符串或模式并将它们替换为 Direct3D 同等内容?”

    • 解答:不可以。OpenGL ES 2.0 和 Direct3D 11 来自不同的图形管道模型。尽管它们表面上在概念和 API 之间有一些相似之处,如呈现上下文和着色器的实例化,但你也应该查看本指南以及 Direct3D 11 参考以便再次创建管道时你可以做出最佳选择,而不是尝试 1 对 1 映射。但是,如果你从 GLSL 移植到 HLSL,那么为 GLSL 变量、内部函数以及函数创建一组常用的别名不仅会使移植更加容易,而且还可以保留唯一一组着色器代码文件。

(转)规划从 OpenGL ES 2.0 到 Direct3D 的移植的更多相关文章

  1. 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)

    0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...

  2. 在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping)

    在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping) 视差贴图 最近一直在研究如何在我的 iPad 2(只支持 OpenGL ES 2.0, 不支持 3.0) 上实现 视 ...

  3. Beginning OpenGL ES 2.0 with GLKit Part 1

    Update 10/24/12: If you’d like a new version of this tutorial fully updated for iOS 6 and Xcode 4.5, ...

  4. OpenGL ES 3.0 基础知识

    首先要了解OpenGL的图形管线有哪些内容,再分别去了解其中的相关的关系: 管线分别包括了顶点缓冲区/数组对象,定点着色器,纹理,片段着色器,变换反馈,图元装配,光栅化,逐片段操作,帧缓冲区.其中顶点 ...

  5. OpenGL ES 3.0 点,线,三角形绘制形式总结

    OpenGL ES 3.0 顶点     -1,  1, 0, -0.5f,  0, 0,     0, -1, 0,    -1,  0, 0, 0.5f,   0, 0,     1, -1,   ...

  6. Android OpenGL ES 3.0 纹理应用

    本文主要演示OpenGL ES 3.0 纹理演示.接口大部分和2.0没什么区别,脚本稍微有了点变化而已. 扩展GLSurfaceView package com.example.gles300; im ...

  7. OpenGL ES 2.0 混合

    混合技术 混合技术就是将俩个片元调和,主要用于将通过各项测试准备进入帧缓冲的片元(源片元)与原有片元按照设定的比例加权计算出最终片元的颜色值. OpenGL ES 2.0中是通过设置混合因子来指定两个 ...

  8. WebGL是一种3D绘图标准,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起

    WebGL是一种3D绘图标准,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的一个JavaScript绑定,WebGL可以为HTM ...

  9. 利用JNI技术在Android中调用C++形式的OpenGL ES 2.0函数

    1.                 打开Eclipse,File-->New-->Project…-->Android-->AndroidApplication Projec ...

随机推荐

  1. python3 下载 以及 练习1 以及 pycharm 专业版 安装

    下载python: https://www.python.org/downloads/release/python-365/ ########sample 1 下载pycharm 社区版本,但是web ...

  2. HDU 5792 L - World is Exploding 。容斥原理 + 树状数组 + 离散化

    题目,要求找出有多少对这样的东西,四个数,并且满足num[a]<num[b] &&num[c]>num[d] 要做这题,首先要懂得用树状数组,我设,下面的小于和大于都是严格 ...

  3. DevOps的工程化

    孙敬云 --Worktile高级系统架构师,WTC成员 1.研发的困境 互联网的环境 互联网这个环境比较特别,包括现在不只是互联网,就算是被互联网赋能的这些“互联网+”的企业也在改变,用户在发生变化, ...

  4. 初识MAC(由window到mac的转变适应)

    * Windows上的软件可以拿到Mac上面安装吗? Windows上面的软件不能拿到Mac的操作系统上安装,除此之外,Windows里的 exe文件,在Mac下面也是无法运行的,要特別注意.如果你要 ...

  5. <script>, <script async>, <script defer> 三种标签的区别

    <script>, <script async>, <script defer> 三种标签的区别 <script>标签 阻塞html parsing 脚 ...

  6. 移动端真机调试工具--DebugGap (VIDE)

    越来越多的移动端开发工作,需要我们有一个好的调试工具,以解决各类真机才会遇到的BUG,最近使用了一款DebugGap 的工具,非常方便,在这里推荐给大家. 官网地址 DebugGap  . 按需求下载 ...

  7. 关于在C++中调用system函数

    先看看下面的这一段程序: #include <iostream> #include <cstdlib> int main(int argc, char* argv[]) { s ...

  8. cocos2d-x-2.2.0_win7+vs2010搭建_eclipse+ndk-r9+cygwin搭建_教程以及编译问题汇总

    声明:我是才用c/c++和cocos2d-x的如果有错误欢迎指出 文章内容我亲测过可以通过,同时我也会一直更新内容 感谢那些把自己的东西分享出来的人 原文地址:http://www.cnblogs.c ...

  9. 详情介绍win7:编辑文件夹时提示操作无法完成,因为其中的文件夹或文件已在另一个程序中打开的解决过程

    我们在使用电脑中,总会遇到下面这种情况: 那怎么解决呢,现在就开始教程: 在电脑的底下显示各种图标那一行点击右键,再选择“启动任务管理器” 接下来你就可以对你刚刚要操作的文件进行重命名.删除等操作啦! ...

  10. pat乙级1049

    浮点型乘整型和整型乘浮点型结果不同,不知为什么. double sum = 0.0; ; i < n; i++) { cin >> a[i]; sum += a[i] * (i + ...