如果你移植 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. Unity Gizmos可视化辅助工具

    所有gizmo绘制需要在脚本的OnDrawGizmos或OnDrawGizmosSelected里函数完成. OnDrawGizmos在每帧调用.所有在OnDrawGizmos中渲染的gizmos都是 ...

  2. Storm概念学习系列之Spout数据源

    不多说,直接上干货! Spout 数据源 消息源Spout是Storm的Topology中的消息生产者(即Tuple的创造者). Spout 介绍 1. Spout 的结构 Spout 是 Storm ...

  3. 利用Cookie保存用户身份信息实现免登录

    <%@page import="sun.misc.BASE64Encoder"%> <%@page import="java.util.Base64.E ...

  4. bootstrapValidator 如何重新启用提交按钮

    bootstrapValidator 使用中,由于字段检查等原因,致使提交按钮失效.如何重新启用提交按钮呢? 下面一句代码可以实现启用提交按钮: $('#loginForm').bootstrapVa ...

  5. centos7 源码编译nginx

    使用configure命令配置编译.它定义了系统的各个方面,包括允许使用 nginx 进行连接处理的方法.最后它创建一个Makefile.该configure命令支持以下参数: --prefix=pa ...

  6. SqlServer图形数据库初体验

    SQL Server2017新增了一个新功能叫做图形数据库.图形指的拓扑图形,是一些Node表和Edge表的合集,Node对应关系数据库中的实体,比如一个人.一个岗位等,Edge表指示Node之前的关 ...

  7. badboy页面脚本发生错误,解决方案

    1.参考网址:https://jingyan.baidu.com/article/e9fb46e17537797520f76645.html?from=qqbrowser061108 本人亲自测试,方 ...

  8. shell实现mysql数据库备份

    #!/bin/bash DB_USER="root" #数据库用户名 DB_PASS="12345678" #数据库密码 BACK_DIR="/bac ...

  9. IOS UITabBarController(控制器)的子控制器

    UITabBarController的简单使用 ● UITabBarController的使用步骤 ➢ 初始化UITabBarController ➢ 设置UIWindow的rootViewContr ...

  10. POJ 3126 Prime Path(筛法,双向搜索)

    题意:一个4位的素数每次变动一个数位,中间过程也要上素数,问变成另一个的最小步数. 线性筛一遍以后bfs就好.我写的双向,其实没有必要. #include<cstdio> #include ...