精华内容
下载资源
问答
  • Shader小常识之——游戏渲染理论篇

    千次阅读 2018-07-24 20:30:22
    游戏世界里看到的物体,其实大多都是现实世界的模拟,尤其是随着硬件的发展,游戏厂商制作的品质越来越精良,现在游戏做的越来越“真实”,而这个“真实”是离不开现实物理的,所以本文来说一些关于游戏渲染与物理...

    游戏世界里看到的物体,其实大多都是现实世界的模拟,尤其是随着硬件的发展,游戏厂商制作的品质越来越精良,现在游戏做的越来越“真实”,而这个“真实”是离不开现实物理的,所以本文来说一些关于游戏渲染物理现象的那些事儿。、

    先说一个众所周知的物理知识,反射折射:光由空气射入水面时,入射光线一部分会被反射,一部分会被折射。
    这里写图片描述
    OK,那么我们知道了光从一个介质进入另一介质的两个归处。这个规律适用于所有的理想环境(我们举了一个很常见很好理解的例子,但这个情景太理想主义,现实中,水并非是均匀介质,水面也并非平坦无比),现在,让我们用显微镜将世界放大了看,当光线传过空气中的尘埃,水中被搅拌起的泥土时,也会发射折射和反射,那这些本来折射进入水中的光线,有可能在浑浊的水中经过几次反射后又射出水面,这是完全有可能的。那么,当光线照射一块石头或者皮肤的时候,从微观上来讲,也会发生类似的现象,那些本来射入介质内的光子与介质粒子碰撞后射向不同方向的现象,我们把它叫做散射
    这里写图片描述
    现在我们可以知道,入射光线一部分发生反射,一部分发生透射。对于金属导体来说,透射光线完全被吸收,而对于非金属来说,透射光线一部分被吸收,另一部分散射出来。举个很简单的例子,我们小时候经常玩的激光射向手指,可以看到红色光线从手指穿透过来,这被叫做次表面散射(SubSurface Scattering)游戏中经常会用到。

    在物理世界中,要遵循能量守恒定律,而光作为一种能量同样也要遵守这个规律,也就是说:入射能量=反射能量+透射能量.

    那么,当光线进入一个物体时,我们只要知道反射率,就能知道物体要显示什么颜色,物体的反射率和物体的材质、颜色有关。在物体表面完全平坦时发生的反射被叫做镜面反射,但实际上,大多数平面都不是光学平面,都会有凹凸不平的表面对光线做出不同方向上的反射,像这样的反射,我们称之为漫反射
    这里写图片描述
    物体表面越光滑,镜面反射占比较多,反射就越清晰,能量相对集中,高光处很亮,整体偏暗;反之物体越粗糙,漫反射占比较多,反射也就越模糊,能量相对分散,物体整体显得较亮。

    而在微表面理论中,视线垂直于表面时,反射较弱,而当视线非垂直表面时,夹角越小,反射越明显,Fresnel反射就是为了模拟真实世界的这种光学现象。

    以上就是常见游戏渲染需要知道的理论,很多公式也都是根据理论而来,后边有空会在游戏中具体实现,今天就讲这么多。(以上图片都是来自网络,侵删)

    展开全文
  • 多平台游戏渲染开发

    千次阅读 2015-11-10 18:19:22
    跨平台移动应用开发的渲染解决方案综述 在移动设备上做应用/游戏开发,实现跨平台是主流。对于应用/游戏的逻辑功能和核心算法部分,如果是用C++进行开发的,因为iOS/Android/Windows Phone 8/Windows Store均支持...


    返回首页>

    跨平台移动应用开发的渲染解决方案综述

    在移动设备上做应用/游戏开发,实现跨平台是主流。对于应用/游戏的逻辑功能和核心算法部分,如果是用C++进行开发的,因为iOS/Android/Windows Phone 8/Windows Store均支持Native的C++开发,所以可以轻松的移植到各个平台,应用/游戏的Backend也有如Photon这样的跨平台解决方案。对于一部分图形要求很高的应用,如游戏和一些UI定制化需求很多的应用,渲染部分往往需要花更多的精力实现移植。对于渲染部分,跨平台开发者有以下三种选择:

    1)  使用已有的一些跨平台图形解决方案,如cocos2D-x, Unity 3D等游戏引擎以及HTML5。

    2)  将渲染部分在程序设计时独立,针对不同的平台分别实现渲染。在Windows Phone / Windows Store应用中,DirectX和XAML可以结合使用,从而方便的与第三方SDK结合使用。

    3)  将现有的渲染代码通过工具映射到其他平台。如开源的Angle project可以将OpenGL ES自动映射到DirectX。

    本文将分别对这三种选择依次作介绍,为开发者顺利完成应用/游戏在渲染部分的移植作一个参考。因时间和能力有限,谬误之处请不吝指教。

    (1) 使用游戏引擎/HTML5等现有的跨平台解决方案

    cocos2d-x:cocos2d-x是一个开源免费、易学易用的2D跨平台游戏引擎,支持Windows Phone, Windows 8, iOS和Android多个平台。目前是国内最流行的2D游戏引擎。其下载地址为:

    http://www.cocos2d-x.org/news/143

    Unity 3D: Unity 3D是一个非常强大的商用跨平台开发工具,支持Windows Store, Windows Phone, iOS, Android, Wii等多个平台。Unity 3D是移动平台上3D引擎的领头羊,同时Unity 3D也能很好的支持2D图形开发。下载地址:

    http://unity3d.com/unity/whats-new/unity-4.3

    XNA:XNA可支持Windows, Xbox 360和Window Phone,以前使用XNA开发的针对Window Phone 7.x的游戏仍然可以在Windows Phone 8上运行。但不支持创建新的目标设备为WP8的游戏。请参考:

    http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj207003(v=vs.105).aspx

    http://msdn.microsoft.com/en-us/library/bb200104.aspx

    MonoGame:MonoGame旨在帮助XNA开发者在Windows Phone 8, Windows 8,iOS, Android,Mac,Linux等多个平台实现跨平台开发。官方主页:
    http://www.monogame.net/

    在开源平台codeplex上的页面:http://monogame.codeplex.com/

    Marmalade:Marmalade是一个非常有特色的跨平台游戏引擎,它支持在Windows上将应用Deploy至iOS。支持将OpenGL的程序直接转换成DirectX11的以移植到Windows Phone平台上。请参考:

    https://www.madewithmarmalade.com/

    http://www.madewithmarmalade.com/windows-phone-8

    HTML5: 除了游戏引擎,还可以使用HTML5实现跨平台。对Windows Store游戏,可使用HTML5 和 JavaScript。如果熟悉HTML5 和 JavaScript (WinJS) 的开发,同时游戏不需要复杂的动画效果,并且对于游戏的实时性能没有非常高的要求,可以考虑这种游戏开发模式。

    推荐使用的情景:充分利用HTML5 和 JavaScript(WinJS)的开发经验。 方便页游的迁移,缩短开发周期

    不推荐使用的情景:如果你的游戏有大量的图像处理,或者对性能要求很高,使用HTML5 和 JavaScript 开发模式就不太适合你的游戏。 最好使用DirectX 和 C++ 结合。

    请参考:http://msdn.microsoft.com/en-us/library/windows/apps/hh465158.aspx

    开发例子:design.htmlwindowsapps/JavaScript-and-HTML5-touch-d96f6031

    (2)针对不同平台分别用OpenGL / OpenGL ES或者DirectX实现渲染

    在跨平台应用程序设计的时候,我们可以将渲染部分独立,最简单的设计是创建 Renderer类,分别针对Windows Phone, iOS和Android实现。众所周知,OpenGL ES主要用于Android和iOS平台的开发。而WP8和Windows Store使用DirectX11 API。接下来我们重点比较OpenGL和DirectX的异同,供开发者在切换平台时参考。

    OpenGL ES / OpenGL与DirectX性能比较

    这是一个在OpenGL和DirectX诞生以来很多人比较热衷于讨论的问题,所以在这里简要的提一下。其实一款显卡在设计的时候就会考虑要支持OpenGL和DirectX两种标准的所有feature,而不管是GLSL还是HLSL的shader,在经过驱动编译后都是在同样的硬件中同样的并行计算模块上运算,纹理等resource也是存储在同样的显存上。OpenGL和DirectX实现的应用程序其性能更多取决于驱动的优化程度而非OpenGL / DirectX API的优劣。OpenGL或者DirectX的API的选择对游戏的性能的影响主要局限于CPU部分而不是GPU。例如AMD最近发布的Mantle API其主要优化也是集中于减少CPU的开销,且仅适用于AMD显卡。而OpenGL和DirectX的API对CPU部分开销的比较至今没有一个定论,也即没有一方是明显优于另一方。OpenGL ES在设计时是参考OpenGL的,可以说是OpenGL的一个子集,其API也没有优于DirectX的说法。

    开发者如果对游戏性能有所顾虑,可以更多的可考虑一些平台相关的特性而非API本身。例如在iOS使用pvr格式的纹理(PowerVR的有损压缩格式),而在Windows平台使用DDS格式的纹理。在下文中有关于手机纹理的详细说明:

    手持平台纹理格式说明

    硬件对OpenGL ES和DirectX的支持

    在写这篇文档的时候(2013年10月),智能手机普遍可以支持OpenGL ES 2.0或以上了。下面的表格列出了OpenGL ES与DirectX的比较。OpenGL ES 2.0相当于DirectX 3D的feature level 9。OpenGL ES 2.0所支持的GLSL对应于DirectX的HLSL。

    OpenGL ES版本列表

    OpenGL ES版本号 对应OpenGL版本 对应的DX版本 版本特性
    1.0 OpenGL 1.3 低于DX9 Fixed function rendering
    1.1 OpenGL 1.5 低于DX9 Fixed function rendering。虽然OpenGL 1.5中引入了ARB shader,但是OpenGL ES 1.1中仍然是不支持的。
    2.0 OpenGL 2.0 DX9 支持GLSL
    3.0 OpenGL 3.0 DX10与DX9之间 兼容OpenGL ES 2.0,但不支持DX10中才有的Geometry Shader, OpenGL自3.2版本开始支持Geometry Shader.

    OpenGL和OpenGL ES详细信息可参考Spec或Wiki中的介绍。可参考下面的链接:

    http://www.khronos.org/opengles/

    http://en.wikipedia.org/wiki/OpenGL

    http://en.wikipedia.org/wiki/OpenGL_ES

    DirectX 版本(忽略DirectX9以前版本,因为不论WP还是Win8的硬件最低要求都是支持DX 9.1)

    DX版本 与OpenGL ES对应关系 支持的 Shader
    9.x 功能上相当于OpenGL ES 2.0 Vertex Shader, Pixel Shader
    10.x 包含OpenGL ES 3.0的feature 增加了 Geometry Shader
    11.x 包含DX10且包含OpenGL ES 3.0 增加了 Hull Shader和 Domain Shader

    各应用平台对OpenGL ES、DirectX以及OpenGL(非ES)的支持

    Android iOS Windows Phone / Windows Store

    根据下面的讨论,在2010年,已经有超过75%的Android设备可以通过NDK支持OpenGL ES 2.0. 估计目前绝大多数Android设备均可使用至少OpenGL ES 2.0。

    https://groups.google.com/forum/#!topic/android-developers/HBddHFyxYeo

    需要Android 4.3或以上才能支持OpenGL ES 3.0

    从iPhone 3GS开始支持OpenGL ES 2.0.

    从iPhone 5S开始支持OpenGL ES 3.0

    从Windows Phone 8开始支持DirectX 11的API,其feature level是DX 9.3。开发必须使用DirectX 11的API。

    Surface RT要求必须能运行DX 9.1的feature。

    在Windows Store中针对x86和x64平台可使用DX10和DX11的feature。如无法支持DX9,需要在程序启动后显示说明。

    在WP8之前的WP,可使用XNA开发,相当于DX9的feature level。

    在Windows Store应用中,可使用OpenGL(非ES)开发。参考如下:

    http://opengl.codeplex.com/

    OpenGL ES 2.0是目前在iOS和Android平台上通常使用的图形解决方案,常用的游戏引擎中的渲染部分是对OpenGL ES的封装。OpenGL ES 2.0所对应的DirectX 版本是DirectX 9,。而WP8和Windows 8对硬件的最低硬件要求即DX9,这使得基于OpenGL或者游戏引擎的应用向WP/Windows 8移植变成很自然的事情。

    WP8和Windows 8应用商店的应用需要使用DX11的API进行编程,我们只需要将DX11的Feature level设置为DX9即可(参考下面的代码片断)对应于OpenGL ES 2.0。对于Windows Store中的应用,我们还可以使用DX10和DX11中的feature, 实现比OpenGL ES 2.0更加强大的渲染功能和更好的性能。

    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, 
         D3D_FEATURE_LEVEL_9_2, 
         D3D_FEATURE_LEVEL_9_1 
    }; 
    D3D_FEATURE_LEVEL APP_MIN_FEATURE_LEVEL = D3D_FEATURE_LEVEL_9_1; 

    如前所述,其实OpenGL ES 2.0是OpenGL 2.0的子集,对应于DirectX的Feature level 9所能够实现的功能是相当的。所以能够使用OpenGL实现的效果,通常也可以使用DirectX实现。Visual Studio支持两种DirectX的模板,一种是仅使用DirectX而不使用XAML,另外一种是将DirectX和XAML结合。我们比较推荐的是DirectX和XAML结合。因为XAML中定义的丰富的界面元素,交互的实现更加简单。第三方的SDK如微博,支付相关SDK都需要XAML的支持。在微软设计DirectX和XAML结合的时候,已经针对不同情景尽可能减少结合时对性能的影响。

    XAML与DirectX结合使用的相关文档请参考:

    http://channel9.msdn.com/Events/Windows-Camp/Developing-Windows-8-Metro-style-apps-in-Cpp/Building-Apps-with-Cpp-XAML-and-DirectX

    http://blogs.msdn.com/b/windowsappdev/archive/2012/03/15/combining-xaml-and-directx.aspx

    http://mobile.dzone.com/articles/directx-and-xaml-windows-phone

    不管是OpenGL和DirectX,渲染时都需要维护所谓的Context。在Context中保存了一些渲染时的状态信息,例如是否使用了光照,是否启用了雾效,当前使用的纹理是什么等等。一般创建Context的过程都是由平台的模板自动生成,开发者只需要对Context进行适当的设置,并调用OpenGL或者DX的API进行渲染即可。OpenGL ES和DX11创建Context以渲染的过程分别如下(谨供参考,一般移动应用的程序员不需要关心细节):

    最常见的渲染过程是设定vertex buffer(VB)、index buffer(IB)、纹理、shader、调用绘制函数,最后显示缓冲中的渲染图像。下面的表格将主要从这几个方面对OpenGL ES和DX作比较。

      OpenGL ES DirectX 11

    Vertex buffer 和 Index buffer(通常称VB和IB)

    在显存/内存中的存储方式和二者没有区别,均按顺序线性存放数据。但使用VB和IB的API略不同

    VB和IB中定义的模型通过draw函数绘制。

    通常使用glDrawElements函数

    偶尔使用glDrawArrays函数(不需要IB)

    glBegin, glEnd, glVertex3f等OpenGL函数在OpenGL ES中因为效率的考虑已经移除。

    Draw通常使用DrawIndexed绘制VB/IB中的内容

    也有DrawInstanced, DrawAuto等函数可供选择

    注意Instancing在DX9中已经支持,在OpenGL 3.0才支持。

    在DX 10以后还可通过Geometry shader实现Instancing

    VB中顶点的属性(Attribute) 如normal, color, texture坐标, position等等

    使用glVertexAttribPointer函数分别指定顶点的各个属性

    与DX的比较可参考下文:

    将 OpenGL ES 2.0 缓冲区、uniform 和顶点属性与 Direct3D 进行比较

    DX的API中没有Attribute这个概念,仅使用结构体 D3D11_INPUT_ELEMENT_DESC描述VB中每个顶点的数据格式

    m_d3dDevice->CreateInputLayout

    Shader / Program

    OpenGL中Shader又叫Program

    支持运行时编译,即GLSL文本在运行时编译。

    分Vertex Program和Fragment Program

    对于Windows Store和WP8需要在编译时将HLSL编译成生成伪汇编代码。如Shader编译出错则无法生成可执行文件。

    在DX feature level 9中

    分Vertext Shader和Pixel Shader分别对应于GLSL中的Vertex Program 和Fragment Program

    Shader的常数设置

    API中包含Uniform,如:

    glGetUniformLocation
    glUniform4fv

    使用Constant Buffer相关函数,如:

    m_d3dDevice->CreateBuffer

    m_d3dContext->UpdateSubresource

    m_d3dContext->VSSetConstantBuffers

    资源管理,如纹理和buffer 使用glCreateShader, glBufferData, glGenBuffers, glTexImage2D, eglBindTexImage等等API管理资源 使用ID3D11Device管理资源。一般会有一个ID3D11Device指针,用以调资源管理的DX API ,如函数CreateTexture2D()。在Windows Store的应用可以使用一些已经封装好的Loader类加载纹理资源。微软的Sample中常使用BasicLoader类,程序员可在其基础上进一步修改增强。
    Context管理, 用于配置渲染管线 glAttachShader, glGetUniform*等等API 一般创建ID3D11DeviceContext类的指针,再使用context指针调用Context配置的API
    显示缓冲区内容 使用SwapChain函数 使用Present函数

    坐标系

    X正方向为右,Y正方向为上。

    详细的异同可参考下面:

    Coordinate Systems (Direct3D 9)

    OpenGL使用右手坐标系,所以Z的正方向指向屏幕外。

    DX使用左手坐标系。所以移植时三角形的顶点顺序要反向,Z的方向也要反向。

    可以使用函数 D3DXMatrixPerspectiveRH 和D3DXMatrixOrthoRH来做右手坐标系的投影映射。详细请参考最左边的链接

    从OpenGL API映射到DirectX 3D的API

    ======================================

    仍在更新的关于OpenGL到DX映射的文档

    http://msdn.microsoft.com/zh-cn/library/windows/apps/dn166866.aspx

    常用的EGL API Mapping参考
    http://msdn.microsoft.com/zh-cn/library/windows/apps/dn166867.aspx

    最后需要指出,DirectX在Windows Phone和Windows Store的应用开发中略有区别,可参考如下:

    http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj662930%28v=vs.105%29.aspx

    以下是DirectX版本中渲染一个旋转的立方体的Render函数实现,结合前面描述的OpenGL与DirectX的比较,读者可与前面Angle Project中RotatingCube的Sample做个比较。

    void Sample3DSceneRenderer::Render()
    {
    	// Loading is asynchronous. Only draw geometry after it's loaded.
    	if (!m_loadingComplete)
    	{
    		return;
    	}
    	auto context = m_deviceResources->GetD3DDeviceContext();
    	// Set render targets to the screen.
    	ID3D11RenderTargetView *const targets[1] = { m_deviceResources->GetBackBufferRenderTargetView() };
    	context->OMSetRenderTargets(1, targets, m_deviceResources->GetDepthStencilView());
    	// Prepare the constant buffer to send it to the graphics device.
    	context->UpdateSubresource(
    		m_constantBuffer.Get(),
    		0,
    		NULL,
    		&m_constantBufferData,
    		0,
    		0
    		);
    	// Each vertex is one instance of the VertexPositionColor struct.
    	UINT stride = sizeof(VertexPositionColor);
    	UINT offset = 0;
    	context->IASetVertexBuffers(
    		0,
    		1,
    		m_vertexBuffer.GetAddressOf(),
    		&stride,
    		&offset
    		);
    	context->IASetIndexBuffer(
    		m_indexBuffer.Get(),
    		DXGI_FORMAT_R16_UINT, // Each index is one 16-bit unsigned integer (short).
    		0
    		);
    	context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
    	context->IASetInputLayout(m_inputLayout.Get());
    	// Attach our vertex shader.
    	context->VSSetShader(
    		m_vertexShader.Get(),
    		nullptr,
    		0
    		);
    	// Send the constant buffer to the graphics device.
    	context->VSSetConstantBuffers(
    		0,
    		1,
    		m_constantBuffer.GetAddressOf()
    		);
    	// Attach our pixel shader.
    	context->PSSetShader(
    		m_pixelShader.Get(),
    		nullptr,
    		0
    		);
    	// Draw the objects.
    	context->DrawIndexed(
    		m_indexCount,
    		0,
    		0
    		);
    }

    方便开发者使用DirectX进行开发的工具和模板

    =====================================

    1. BasicLoader类:是微软开发的一个用于加载纹理的类,可同步也可异步加载。支持各种图像格式,也支持DDS格式的纹理。因为该类使用到Wic解码器用于图像解码,而Wic解码器仅限于PC,在WP上没有Wic解码器的支持,所以在WP上推荐使用DDS纹理。

    2. 在Visual studio中集成了DDS纹理查看器,可直接打开DDS文件。也可提供一些常用的编辑功能。可以选择不规则区域并编辑。

    3. 3D游戏中常用的FBX文件也可以在Visual Studio中打开并编辑。

    4. DirectX的Debugging在调试时可以打开debugging模式。也可使用DirectX SDK中的工具PIX抓取一段,以单步跟踪D3D的API call。

    5. Codeplex上开源的ToolKit http://directxtk.codeplex.com/wikipage?title=Samples

    6. 开发者从头开始开发的选择。新建一个WP 8/Windows Store应用的时候,可支持多种模板,有仅使用DX的模板,也有用XAML与D3D混编的模板。比较推荐的方式是使用XAML和DirectX混编的方式以充分结合两者的强大功能。下图是在新建一个Windows Phone应用时的模版,其中高亮的是Windows Phone Direct3D with XAML App,而Windows Store里的模版名为DirectX App,因为Windows Store的模版不仅集成了DirectX 3D,还集成了DirectX 2D和DirectX Write。

    在应用开发的框架中,已经将常规的操作完成,如Buffer Chain,刷新,场景坐标系统设置等等。开发者需要做的是完成渲染和应用的逻辑。

    对于Windows Store开发,在Shooting Game的Sample中开发者可学习一个现成的DirectX和XAML结合的游戏框架,包括关卡设计、应用内购买、交互、渲染和音效等等技术:

    http://msdn.microsoft.com/en-us/library/windows/apps/hh780560.aspx

    对于Windows Phone中的游戏开发,下面的Marble Maze这个Sample很不错:

    http://code.msdn.microsoft.com/wpapps/Marble-Maze-sample-for-c9f3706b

    C++/CX

    因为使用DirectX必须使用native code,所以必须使用C++/CX。这是微软定义的一个C++ Extension,是兼容标准C++的。所以移植C++代码是非常方便的。C++/CX中有一些非常方便的新特性,掌握起来也不难,可提高使用编程效率。如多线程、Lamda表达示等。对于C++程序员来说,快速掌握C++/CX可参考下面的文档:

    多线程编程
    http://channel9.msdn.com/events/BUILD/BUILD2011/PLAT-203T

    C++/CX介绍及参考:

    http://blogs.msdn.com/b/vcblog/archive/2012/08/29/cxxcxpart00anintroduction.aspx

    3)使用AngleProject将现有的OpenGL ES代码转换

    Angle是一个开源的项目,用于将OpenGL ES转成DirectX以在Windows平台中使用。Angle目前是Chrome浏览器中使用的渲染跨平台解决方案。
    https://code.google.com/p/angleproject/

    AngleProject编译方法
    https://code.google.com/p/angleproject/wiki/DevSetup

    直接使用Angle Project移植OpenGL ES会遇到下面的问题

    ====================================================
    1. Angle
    使用DirectX 11的部分是针对feature level 10的。而WP8/Surface RT仅支持到feature level 9.

    2. Angle是动态在Runtime将GLSL转成HLSL,而我们需要在编译时即把GLSH转成HLSL. WP8不支持Runtime的shader编译.

    Angle Project中对Windows Phone 8 / Windows 8 RT的适配

    Angle Project针对Windonws Phone 8/ Windows 8 RT进行了如下适配,并在cocos2d-x中使用

    1. 支持编译时将GLSL转成HLSL并编译成.cso。.cso文件是在Windows Store和Windows Phone平台上HLSL编译后的文件。CSO文件应该是伪汇编程序,在经过驱动进一步编译后可以在显卡上运行。

    2.将DX10的feature去除,因为WP8只支持到DX 9.3.

    使用了Angle Project且支持WP8的cocos2D-x 2.2下载地址为:

    http://www.cocos2d-x.org/news/143

    在Angle Project的source code tree中有一个RotatingCube的例子,开发者可参考用于OpenGL ES向WP / Windows Store的移植。

    https://github.com/stammen/angleproject/tree/dev/samples/RotatingCube

    Anglge project关于WP8的说明如下。简而言之,Angle对WP8是支持的,对Windows Store 8目前支持有限制,但是如果应用是target到Windows 8.1是支持的。

    https://github.com/stammen/angleproject

    Angle Project (https://code.google.com/p/angleproject/) with support for Windows Store Apps (WinRT) and Windows Phone Apps (WP8). This version supports developing Windows Store Apps using Visual Studio 2013 and Windows 8.1. It is also ossible to develop a Windows Store App using Visual Studio 2012 and Windows 8.0 but this version will not be accepted in the Windows App Store.  

    Angle Project的RotatingCube这个Sample其 Render()函数如下。可以看到在例子中绘制使用的API是OpenGL ES的API。存储顶点数据可以使用directxmath.h中定义的数据结构。

    void CubeRenderer::Render()
    {
    XMFLOAT4X4 mvp;
    XMStoreFloat4x4(&mvp, (XMMatrixMultiply(XMMatrixMultiply(m_modelMatrix, m_viewMatrix), m_projectionMatrix)));
    glClearColor(0.098f, 0.098f, 0.439f, 1.000f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glUseProgram(m_colorProgram);
    glUniformMatrix4fv(u_mvpColor, 1, GL_FALSE, &mvp.m[0][0]);
    VertexPositionColor cubeVertices[] = 
    	{
    		{XMFLOAT3(-0.5f, -0.5f, -0.5f), XMFLOAT3(0.0f, 0.0f, 0.0f)},
    		{XMFLOAT3(-0.5f, -0.5f,  0.5f), XMFLOAT3(0.0f, 0.0f, 1.0f)},
    		{XMFLOAT3(-0.5f,  0.5f, -0.5f), XMFLOAT3(0.0f, 1.0f, 0.0f)},
    		{XMFLOAT3(-0.5f,  0.5f,  0.5f), XMFLOAT3(0.0f, 1.0f, 1.0f)},
    		{XMFLOAT3( 0.5f, -0.5f, -0.5f), XMFLOAT3(1.0f, 0.0f, 0.0f)},
    		{XMFLOAT3( 0.5f, -0.5f,  0.5f), XMFLOAT3(1.0f, 0.0f, 1.0f)},
    		{XMFLOAT3( 0.5f,  0.5f, -0.5f), XMFLOAT3(1.0f, 1.0f, 0.0f)},
    		{XMFLOAT3( 0.5f,  0.5f,  0.5f), XMFLOAT3(1.0f, 1.0f, 1.0f)},
    	};
    unsigned short cubeIndices[] = 
    {
            0,2,1, // -x
            1,2,3,
            4,5,6, // +x
            5,7,6,
            0,1,5, // -y
            0,5,4,
            2,6,7, // +y
            2,7,3,
            0,4,6, // -z
            0,6,2,
            1,3,7, // +z
            1,7,5,
    };
    glEnableVertexAttribArray(a_positionColor);
    glEnableVertexAttribArray(a_colorColor);
    glVertexAttribPointer(a_positionColor, 3, GL_FLOAT, GL_FALSE, sizeof(VertexPositionColor), cubeVertices);
    glVertexAttribPointer(a_colorColor, 3, GL_FLOAT, GL_FALSE, sizeof(VertexPositionColor), reinterpret_cast(cubeVertices) + sizeof(XMFLOAT3));
    glDrawElements(GL_TRIANGLES, ARRAYSIZE(cubeIndices), GL_UNSIGNED_SHORT, cubeIndices);
    glDisableVertexAttribArray(a_positionColor);
    glDisableVertexAttribArray(a_colorColor);
    }

    Android平台上OpenGL ES函数调用时,使用GLES20.来调用,OpenGL ES的函数名是不变的。所以渲染部分如使用Angle Project迁移时需要对代码稍作调整,但并不复杂。

    //sample: Android 的 Draw()函数
    public void draw() {
        // Add program to OpenGL ES environment
        GLES20.glUseProgram(mProgram);
        // get handle to vertex shader's vPosition member
        mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
        // Enable a handle to the triangle vertices
        GLES20.glEnableVertexAttribArray(mPositionHandle);
        // Prepare the triangle coordinate data
        GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,
                                     GLES20.GL_FLOAT, false,
                                     vertexStride, vertexBuffer);
        // get handle to fragment shader's vColor member
        mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
        // Set color for drawing the triangle
        GLES20.glUniform4fv(mColorHandle, 1, color, 0);
        // Draw the triangle
        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
        // Disable vertex array
        GLES20.glDisableVertexAttribArray(mPositionHandle);
    }

    返回首页>

    跨平台移动应用开发的渲染解决方案综述

    在移动设备上做应用/游戏开发,实现跨平台是主流。对于应用/游戏的逻辑功能和核心算法部分,如果是用C++进行开发的,因为iOS/Android/Windows Phone 8/Windows Store均支持Native的C++开发,所以可以轻松的移植到各个平台,应用/游戏的Backend也有如Photon这样的跨平台解决方案。对于一部分图形要求很高的应用,如游戏和一些UI定制化需求很多的应用,渲染部分往往需要花更多的精力实现移植。对于渲染部分,跨平台开发者有以下三种选择:

    1)  使用已有的一些跨平台图形解决方案,如cocos2D-x, Unity 3D等游戏引擎以及HTML5。

    2)  将渲染部分在程序设计时独立,针对不同的平台分别实现渲染。在Windows Phone / Windows Store应用中,DirectX和XAML可以结合使用,从而方便的与第三方SDK结合使用。

    3)  将现有的渲染代码通过工具映射到其他平台。如开源的Angle project可以将OpenGL ES自动映射到DirectX。

    本文将分别对这三种选择依次作介绍,为开发者顺利完成应用/游戏在渲染部分的移植作一个参考。因时间和能力有限,谬误之处请不吝指教。

    (1) 使用游戏引擎/HTML5等现有的跨平台解决方案

    cocos2d-x:cocos2d-x是一个开源免费、易学易用的2D跨平台游戏引擎,支持Windows Phone, Windows 8, iOS和Android多个平台。目前是国内最流行的2D游戏引擎。其下载地址为:

    http://www.cocos2d-x.org/news/143

    Unity 3D: Unity 3D是一个非常强大的商用跨平台开发工具,支持Windows Store, Windows Phone, iOS, Android, Wii等多个平台。Unity 3D是移动平台上3D引擎的领头羊,同时Unity 3D也能很好的支持2D图形开发。下载地址:

    http://unity3d.com/unity/whats-new/unity-4.3

    XNA:XNA可支持Windows, Xbox 360和Window Phone,以前使用XNA开发的针对Window Phone 7.x的游戏仍然可以在Windows Phone 8上运行。但不支持创建新的目标设备为WP8的游戏。请参考:

    http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj207003(v=vs.105).aspx

    http://msdn.microsoft.com/en-us/library/bb200104.aspx

    MonoGame:MonoGame旨在帮助XNA开发者在Windows Phone 8, Windows 8,iOS, Android,Mac,Linux等多个平台实现跨平台开发。官方主页:
    http://www.monogame.net/

    在开源平台codeplex上的页面:http://monogame.codeplex.com/

    Marmalade:Marmalade是一个非常有特色的跨平台游戏引擎,它支持在Windows上将应用Deploy至iOS。支持将OpenGL的程序直接转换成DirectX11的以移植到Windows Phone平台上。请参考:

    https://www.madewithmarmalade.com/

    http://www.madewithmarmalade.com/windows-phone-8

    HTML5: 除了游戏引擎,还可以使用HTML5实现跨平台。对Windows Store游戏,可使用HTML5 和 JavaScript。如果熟悉HTML5 和 JavaScript (WinJS) 的开发,同时游戏不需要复杂的动画效果,并且对于游戏的实时性能没有非常高的要求,可以考虑这种游戏开发模式。

    推荐使用的情景:充分利用HTML5 和 JavaScript(WinJS)的开发经验。 方便页游的迁移,缩短开发周期

    不推荐使用的情景:如果你的游戏有大量的图像处理,或者对性能要求很高,使用HTML5 和 JavaScript 开发模式就不太适合你的游戏。 最好使用DirectX 和 C++ 结合。

    请参考:http://msdn.microsoft.com/en-us/library/windows/apps/hh465158.aspx

    开发例子:design.htmlwindowsapps/JavaScript-and-HTML5-touch-d96f6031

    (2)针对不同平台分别用OpenGL / OpenGL ES或者DirectX实现渲染

    在跨平台应用程序设计的时候,我们可以将渲染部分独立,最简单的设计是创建 Renderer类,分别针对Windows Phone, iOS和Android实现。众所周知,OpenGL ES主要用于Android和iOS平台的开发。而WP8和Windows Store使用DirectX11 API。接下来我们重点比较OpenGL和DirectX的异同,供开发者在切换平台时参考。

    OpenGL ES / OpenGL与DirectX性能比较

    这是一个在OpenGL和DirectX诞生以来很多人比较热衷于讨论的问题,所以在这里简要的提一下。其实一款显卡在设计的时候就会考虑要支持OpenGL和DirectX两种标准的所有feature,而不管是GLSL还是HLSL的shader,在经过驱动编译后都是在同样的硬件中同样的并行计算模块上运算,纹理等resource也是存储在同样的显存上。OpenGL和DirectX实现的应用程序其性能更多取决于驱动的优化程度而非OpenGL / DirectX API的优劣。OpenGL或者DirectX的API的选择对游戏的性能的影响主要局限于CPU部分而不是GPU。例如AMD最近发布的Mantle API其主要优化也是集中于减少CPU的开销,且仅适用于AMD显卡。而OpenGL和DirectX的API对CPU部分开销的比较至今没有一个定论,也即没有一方是明显优于另一方。OpenGL ES在设计时是参考OpenGL的,可以说是OpenGL的一个子集,其API也没有优于DirectX的说法。

    开发者如果对游戏性能有所顾虑,可以更多的可考虑一些平台相关的特性而非API本身。例如在iOS使用pvr格式的纹理(PowerVR的有损压缩格式),而在Windows平台使用DDS格式的纹理。在下文中有关于手机纹理的详细说明:

    手持平台纹理格式说明

    硬件对OpenGL ES和DirectX的支持

    在写这篇文档的时候(2013年10月),智能手机普遍可以支持OpenGL ES 2.0或以上了。下面的表格列出了OpenGL ES与DirectX的比较。OpenGL ES 2.0相当于DirectX 3D的feature level 9。OpenGL ES 2.0所支持的GLSL对应于DirectX的HLSL。

    OpenGL ES版本列表

    OpenGL ES版本号 对应OpenGL版本 对应的DX版本 版本特性
    1.0 OpenGL 1.3 低于DX9 Fixed function rendering
    1.1 OpenGL 1.5 低于DX9 Fixed function rendering。虽然OpenGL 1.5中引入了ARB shader,但是OpenGL ES 1.1中仍然是不支持的。
    2.0 OpenGL 2.0 DX9 支持GLSL
    3.0 OpenGL 3.0 DX10与DX9之间 兼容OpenGL ES 2.0,但不支持DX10中才有的Geometry Shader, OpenGL自3.2版本开始支持Geometry Shader.

    OpenGL和OpenGL ES详细信息可参考Spec或Wiki中的介绍。可参考下面的链接:

    http://www.khronos.org/opengles/

    http://en.wikipedia.org/wiki/OpenGL

    http://en.wikipedia.org/wiki/OpenGL_ES

    DirectX 版本(忽略DirectX9以前版本,因为不论WP还是Win8的硬件最低要求都是支持DX 9.1)

    DX版本 与OpenGL ES对应关系 支持的 Shader
    9.x 功能上相当于OpenGL ES 2.0 Vertex Shader, Pixel Shader
    10.x 包含OpenGL ES 3.0的feature 增加了 Geometry Shader
    11.x 包含DX10且包含OpenGL ES 3.0 增加了 Hull Shader和 Domain Shader

    各应用平台对OpenGL ES、DirectX以及OpenGL(非ES)的支持

    Android iOS Windows Phone / Windows Store

    根据下面的讨论,在2010年,已经有超过75%的Android设备可以通过NDK支持OpenGL ES 2.0. 估计目前绝大多数Android设备均可使用至少OpenGL ES 2.0。

    https://groups.google.com/forum/#!topic/android-developers/HBddHFyxYeo

    需要Android 4.3或以上才能支持OpenGL ES 3.0

    从iPhone 3GS开始支持OpenGL ES 2.0.

    从iPhone 5S开始支持OpenGL ES 3.0

    从Windows Phone 8开始支持DirectX 11的API,其feature level是DX 9.3。开发必须使用DirectX 11的API。

    Surface RT要求必须能运行DX 9.1的feature。

    在Windows Store中针对x86和x64平台可使用DX10和DX11的feature。如无法支持DX9,需要在程序启动后显示说明。

    在WP8之前的WP,可使用XNA开发,相当于DX9的feature level。

    在Windows Store应用中,可使用OpenGL(非ES)开发。参考如下:

    http://opengl.codeplex.com/

    OpenGL ES 2.0是目前在iOS和Android平台上通常使用的图形解决方案,常用的游戏引擎中的渲染部分是对OpenGL ES的封装。OpenGL ES 2.0所对应的DirectX 版本是DirectX 9,。而WP8和Windows 8对硬件的最低硬件要求即DX9,这使得基于OpenGL或者游戏引擎的应用向WP/Windows 8移植变成很自然的事情。

    WP8和Windows 8应用商店的应用需要使用DX11的API进行编程,我们只需要将DX11的Feature level设置为DX9即可(参考下面的代码片断)对应于OpenGL ES 2.0。对于Windows Store中的应用,我们还可以使用DX10和DX11中的feature, 实现比OpenGL ES 2.0更加强大的渲染功能和更好的性能。

    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, 
         D3D_FEATURE_LEVEL_9_2, 
         D3D_FEATURE_LEVEL_9_1 
    }; 
    D3D_FEATURE_LEVEL APP_MIN_FEATURE_LEVEL = D3D_FEATURE_LEVEL_9_1; 

    如前所述,其实OpenGL ES 2.0是OpenGL 2.0的子集,对应于DirectX的Feature level 9所能够实现的功能是相当的。所以能够使用OpenGL实现的效果,通常也可以使用DirectX实现。Visual Studio支持两种DirectX的模板,一种是仅使用DirectX而不使用XAML,另外一种是将DirectX和XAML结合。我们比较推荐的是DirectX和XAML结合。因为XAML中定义的丰富的界面元素,交互的实现更加简单。第三方的SDK如微博,支付相关SDK都需要XAML的支持。在微软设计DirectX和XAML结合的时候,已经针对不同情景尽可能减少结合时对性能的影响。

    XAML与DirectX结合使用的相关文档请参考:

    http://channel9.msdn.com/Events/Windows-Camp/Developing-Windows-8-Metro-style-apps-in-Cpp/Building-Apps-with-Cpp-XAML-and-DirectX

    http://blogs.msdn.com/b/windowsappdev/archive/2012/03/15/combining-xaml-and-directx.aspx

    http://mobile.dzone.com/articles/directx-and-xaml-windows-phone

    不管是OpenGL和DirectX,渲染时都需要维护所谓的Context。在Context中保存了一些渲染时的状态信息,例如是否使用了光照,是否启用了雾效,当前使用的纹理是什么等等。一般创建Context的过程都是由平台的模板自动生成,开发者只需要对Context进行适当的设置,并调用OpenGL或者DX的API进行渲染即可。OpenGL ES和DX11创建Context以渲染的过程分别如下(谨供参考,一般移动应用的程序员不需要关心细节):

    最常见的渲染过程是设定vertex buffer(VB)、index buffer(IB)、纹理、shader、调用绘制函数,最后显示缓冲中的渲染图像。下面的表格将主要从这几个方面对OpenGL ES和DX作比较。

      OpenGL ES DirectX 11

    Vertex buffer 和 Index buffer(通常称VB和IB)

    在显存/内存中的存储方式和二者没有区别,均按顺序线性存放数据。但使用VB和IB的API略不同

    VB和IB中定义的模型通过draw函数绘制。

    通常使用glDrawElements函数

    偶尔使用glDrawArrays函数(不需要IB)

    glBegin, glEnd, glVertex3f等OpenGL函数在OpenGL ES中因为效率的考虑已经移除。

    Draw通常使用DrawIndexed绘制VB/IB中的内容

    也有DrawInstanced, DrawAuto等函数可供选择

    注意Instancing在DX9中已经支持,在OpenGL 3.0才支持。

    在DX 10以后还可通过Geometry shader实现Instancing

    VB中顶点的属性(Attribute) 如normal, color, texture坐标, position等等

    使用glVertexAttribPointer函数分别指定顶点的各个属性

    与DX的比较可参考下文:

    将 OpenGL ES 2.0 缓冲区、uniform 和顶点属性与 Direct3D 进行比较

    DX的API中没有Attribute这个概念,仅使用结构体 D3D11_INPUT_ELEMENT_DESC描述VB中每个顶点的数据格式

    m_d3dDevice->CreateInputLayout

    Shader / Program

    OpenGL中Shader又叫Program

    支持运行时编译,即GLSL文本在运行时编译。

    分Vertex Program和Fragment Program

    对于Windows Store和WP8需要在编译时将HLSL编译成生成伪汇编代码。如Shader编译出错则无法生成可执行文件。

    在DX feature level 9中

    分Vertext Shader和Pixel Shader分别对应于GLSL中的Vertex Program 和Fragment Program

    Shader的常数设置

    API中包含Uniform,如:

    glGetUniformLocation
    glUniform4fv

    使用Constant Buffer相关函数,如:

    m_d3dDevice->CreateBuffer

    m_d3dContext->UpdateSubresource

    m_d3dContext->VSSetConstantBuffers

    资源管理,如纹理和buffer 使用glCreateShader, glBufferData, glGenBuffers, glTexImage2D, eglBindTexImage等等API管理资源 使用ID3D11Device管理资源。一般会有一个ID3D11Device指针,用以调资源管理的DX API ,如函数CreateTexture2D()。在Windows Store的应用可以使用一些已经封装好的Loader类加载纹理资源。微软的Sample中常使用BasicLoader类,程序员可在其基础上进一步修改增强。
    Context管理, 用于配置渲染管线 glAttachShader, glGetUniform*等等API 一般创建ID3D11DeviceContext类的指针,再使用context指针调用Context配置的API
    显示缓冲区内容 使用SwapChain函数 使用Present函数

    坐标系

    X正方向为右,Y正方向为上。

    详细的异同可参考下面:

    Coordinate Systems (Direct3D 9)

    OpenGL使用右手坐标系,所以Z的正方向指向屏幕外。

    DX使用左手坐标系。所以移植时三角形的顶点顺序要反向,Z的方向也要反向。

    可以使用函数 D3DXMatrixPerspectiveRH 和D3DXMatrixOrthoRH来做右手坐标系的投影映射。详细请参考最左边的链接

    从OpenGL API映射到DirectX 3D的API

    ======================================

    仍在更新的关于OpenGL到DX映射的文档

    http://msdn.microsoft.com/zh-cn/library/windows/apps/dn166866.aspx

    常用的EGL API Mapping参考
    http://msdn.microsoft.com/zh-cn/library/windows/apps/dn166867.aspx

    最后需要指出,DirectX在Windows Phone和Windows Store的应用开发中略有区别,可参考如下:

    http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj662930%28v=vs.105%29.aspx

    以下是DirectX版本中渲染一个旋转的立方体的Render函数实现,结合前面描述的OpenGL与DirectX的比较,读者可与前面Angle Project中RotatingCube的Sample做个比较。

    void Sample3DSceneRenderer::Render()
    {
    	// Loading is asynchronous. Only draw geometry after it's loaded.
    	if (!m_loadingComplete)
    	{
    		return;
    	}
    	auto context = m_deviceResources->GetD3DDeviceContext();
    	// Set render targets to the screen.
    	ID3D11RenderTargetView *const targets[1] = { m_deviceResources->GetBackBufferRenderTargetView() };
    	context->OMSetRenderTargets(1, targets, m_deviceResources->GetDepthStencilView());
    	// Prepare the constant buffer to send it to the graphics device.
    	context->UpdateSubresource(
    		m_constantBuffer.Get(),
    		0,
    		NULL,
    		&m_constantBufferData,
    		0,
    		0
    		);
    	// Each vertex is one instance of the VertexPositionColor struct.
    	UINT stride = sizeof(VertexPositionColor);
    	UINT offset = 0;
    	context->IASetVertexBuffers(
    		0,
    		1,
    		m_vertexBuffer.GetAddressOf(),
    		&stride,
    		&offset
    		);
    	context->IASetIndexBuffer(
    		m_indexBuffer.Get(),
    		DXGI_FORMAT_R16_UINT, // Each index is one 16-bit unsigned integer (short).
    		0
    		);
    	context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
    	context->IASetInputLayout(m_inputLayout.Get());
    	// Attach our vertex shader.
    	context->VSSetShader(
    		m_vertexShader.Get(),
    		nullptr,
    		0
    		);
    	// Send the constant buffer to the graphics device.
    	context->VSSetConstantBuffers(
    		0,
    		1,
    		m_constantBuffer.GetAddressOf()
    		);
    	// Attach our pixel shader.
    	context->PSSetShader(
    		m_pixelShader.Get(),
    		nullptr,
    		0
    		);
    	// Draw the objects.
    	context->DrawIndexed(
    		m_indexCount,
    		0,
    		0
    		);
    }

    方便开发者使用DirectX进行开发的工具和模板

    =====================================

    1. BasicLoader类:是微软开发的一个用于加载纹理的类,可同步也可异步加载。支持各种图像格式,也支持DDS格式的纹理。因为该类使用到Wic解码器用于图像解码,而Wic解码器仅限于PC,在WP上没有Wic解码器的支持,所以在WP上推荐使用DDS纹理。

    2. 在Visual studio中集成了DDS纹理查看器,可直接打开DDS文件。也可提供一些常用的编辑功能。可以选择不规则区域并编辑。

    3. 3D游戏中常用的FBX文件也可以在Visual Studio中打开并编辑。

    4. DirectX的Debugging在调试时可以打开debugging模式。也可使用DirectX SDK中的工具PIX抓取一段,以单步跟踪D3D的API call。

    5. Codeplex上开源的ToolKit http://directxtk.codeplex.com/wikipage?title=Samples

    6. 开发者从头开始开发的选择。新建一个WP 8/Windows Store应用的时候,可支持多种模板,有仅使用DX的模板,也有用XAML与D3D混编的模板。比较推荐的方式是使用XAML和DirectX混编的方式以充分结合两者的强大功能。下图是在新建一个Windows Phone应用时的模版,其中高亮的是Windows Phone Direct3D with XAML App,而Windows Store里的模版名为DirectX App,因为Windows Store的模版不仅集成了DirectX 3D,还集成了DirectX 2D和DirectX Write。

    在应用开发的框架中,已经将常规的操作完成,如Buffer Chain,刷新,场景坐标系统设置等等。开发者需要做的是完成渲染和应用的逻辑。

    对于Windows Store开发,在Shooting Game的Sample中开发者可学习一个现成的DirectX和XAML结合的游戏框架,包括关卡设计、应用内购买、交互、渲染和音效等等技术:

    http://msdn.microsoft.com/en-us/library/windows/apps/hh780560.aspx

    对于Windows Phone中的游戏开发,下面的Marble Maze这个Sample很不错:

    http://code.msdn.microsoft.com/wpapps/Marble-Maze-sample-for-c9f3706b

    C++/CX

    因为使用DirectX必须使用native code,所以必须使用C++/CX。这是微软定义的一个C++ Extension,是兼容标准C++的。所以移植C++代码是非常方便的。C++/CX中有一些非常方便的新特性,掌握起来也不难,可提高使用编程效率。如多线程、Lamda表达示等。对于C++程序员来说,快速掌握C++/CX可参考下面的文档:

    多线程编程
    http://channel9.msdn.com/events/BUILD/BUILD2011/PLAT-203T

    C++/CX介绍及参考:

    http://blogs.msdn.com/b/vcblog/archive/2012/08/29/cxxcxpart00anintroduction.aspx

    3)使用AngleProject将现有的OpenGL ES代码转换

    Angle是一个开源的项目,用于将OpenGL ES转成DirectX以在Windows平台中使用。Angle目前是Chrome浏览器中使用的渲染跨平台解决方案。
    https://code.google.com/p/angleproject/

    AngleProject编译方法
    https://code.google.com/p/angleproject/wiki/DevSetup

    直接使用Angle Project移植OpenGL ES会遇到下面的问题

    ====================================================
    1. Angle
    使用DirectX 11的部分是针对feature level 10的。而WP8/Surface RT仅支持到feature level 9.

    2. Angle是动态在Runtime将GLSL转成HLSL,而我们需要在编译时即把GLSH转成HLSL. WP8不支持Runtime的shader编译.

    Angle Project中对Windows Phone 8 / Windows 8 RT的适配

    Angle Project针对Windonws Phone 8/ Windows 8 RT进行了如下适配,并在cocos2d-x中使用

    1. 支持编译时将GLSL转成HLSL并编译成.cso。.cso文件是在Windows Store和Windows Phone平台上HLSL编译后的文件。CSO文件应该是伪汇编程序,在经过驱动进一步编译后可以在显卡上运行。

    2.将DX10的feature去除,因为WP8只支持到DX 9.3.

    使用了Angle Project且支持WP8的cocos2D-x 2.2下载地址为:

    http://www.cocos2d-x.org/news/143

    在Angle Project的source code tree中有一个RotatingCube的例子,开发者可参考用于OpenGL ES向WP / Windows Store的移植。

    https://github.com/stammen/angleproject/tree/dev/samples/RotatingCube

    Anglge project关于WP8的说明如下。简而言之,Angle对WP8是支持的,对Windows Store 8目前支持有限制,但是如果应用是target到Windows 8.1是支持的。

    https://github.com/stammen/angleproject

    Angle Project (https://code.google.com/p/angleproject/) with support for Windows Store Apps (WinRT) and Windows Phone Apps (WP8). This version supports developing Windows Store Apps using Visual Studio 2013 and Windows 8.1. It is also ossible to develop a Windows Store App using Visual Studio 2012 and Windows 8.0 but this version will not be accepted in the Windows App Store.  

    Angle Project的RotatingCube这个Sample其 Render()函数如下。可以看到在例子中绘制使用的API是OpenGL ES的API。存储顶点数据可以使用directxmath.h中定义的数据结构。

    void CubeRenderer::Render()
    {
    XMFLOAT4X4 mvp;
    XMStoreFloat4x4(&mvp, (XMMatrixMultiply(XMMatrixMultiply(m_modelMatrix, m_viewMatrix), m_projectionMatrix)));
    glClearColor(0.098f, 0.098f, 0.439f, 1.000f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glUseProgram(m_colorProgram);
    glUniformMatrix4fv(u_mvpColor, 1, GL_FALSE, &mvp.m[0][0]);
    VertexPositionColor cubeVertices[] = 
    	{
    		{XMFLOAT3(-0.5f, -0.5f, -0.5f), XMFLOAT3(0.0f, 0.0f, 0.0f)},
    		{XMFLOAT3(-0.5f, -0.5f,  0.5f), XMFLOAT3(0.0f, 0.0f, 1.0f)},
    		{XMFLOAT3(-0.5f,  0.5f, -0.5f), XMFLOAT3(0.0f, 1.0f, 0.0f)},
    		{XMFLOAT3(-0.5f,  0.5f,  0.5f), XMFLOAT3(0.0f, 1.0f, 1.0f)},
    		{XMFLOAT3( 0.5f, -0.5f, -0.5f), XMFLOAT3(1.0f, 0.0f, 0.0f)},
    		{XMFLOAT3( 0.5f, -0.5f,  0.5f), XMFLOAT3(1.0f, 0.0f, 1.0f)},
    		{XMFLOAT3( 0.5f,  0.5f, -0.5f), XMFLOAT3(1.0f, 1.0f, 0.0f)},
    		{XMFLOAT3( 0.5f,  0.5f,  0.5f), XMFLOAT3(1.0f, 1.0f, 1.0f)},
    	};
    unsigned short cubeIndices[] = 
    {
            0,2,1, // -x
            1,2,3,
            4,5,6, // +x
            5,7,6,
            0,1,5, // -y
            0,5,4,
            2,6,7, // +y
            2,7,3,
            0,4,6, // -z
            0,6,2,
            1,3,7, // +z
            1,7,5,
    };
    glEnableVertexAttribArray(a_positionColor);
    glEnableVertexAttribArray(a_colorColor);
    glVertexAttribPointer(a_positionColor, 3, GL_FLOAT, GL_FALSE, sizeof(VertexPositionColor), cubeVertices);
    glVertexAttribPointer(a_colorColor, 3, GL_FLOAT, GL_FALSE, sizeof(VertexPositionColor), reinterpret_cast(cubeVertices) + sizeof(XMFLOAT3));
    glDrawElements(GL_TRIANGLES, ARRAYSIZE(cubeIndices), GL_UNSIGNED_SHORT, cubeIndices);
    glDisableVertexAttribArray(a_positionColor);
    glDisableVertexAttribArray(a_colorColor);
    }

    Android平台上OpenGL ES函数调用时,使用GLES20.来调用,OpenGL ES的函数名是不变的。所以渲染部分如使用Angle Project迁移时需要对代码稍作调整,但并不复杂。

    //sample: Android 的 Draw()函数
    public void draw() {
        // Add program to OpenGL ES environment
        GLES20.glUseProgram(mProgram);
        // get handle to vertex shader's vPosition member
        mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
        // Enable a handle to the triangle vertices
        GLES20.glEnableVertexAttribArray(mPositionHandle);
        // Prepare the triangle coordinate data
        GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,
                                     GLES20.GL_FLOAT, false,
                                     vertexStride, vertexBuffer);
        // get handle to fragment shader's vColor member
        mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
        // Set color for drawing the triangle
        GLES20.glUniform4fv(mColorHandle, 1, color, 0);
        // Draw the triangle
        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
        // Disable vertex array
        GLES20.glDisableVertexAttribArray(mPositionHandle);
    }
    展开全文
  • 问题:目前3D游戏对机子配置要求很高,而且渲染效率不高解决方案:(1)适用范围:局域网内(2)解决办法:运用集群技术把所有运行此游戏的场景放于计算机A,分派给其它计算机渲染任务其它计算机运行时,相当于一台...
    问题:目前3D游戏对机子配置要求很高,而且渲染效率不高
    解决方案:
    (1)适用范围:局域网内
    (2)解决办法:运用集群技术把所有运行此游戏的场景放于计算机A,分派给其它计算机渲染任务
    其它计算机运行时,相当于一台终端,所有的请求均在计算机A的调度下完成
    展开全文
  • 游戏开发入门(三)图形渲染

    万次阅读 多人点赞 2018-01-17 22:15:34
    视频链接:游戏开发入门(三)图形渲染(3节课 时常:约2小时20分钟) 视频链接:一堂课学会shader——渲染拓展课程(3节课 时常:约1小时20分钟) 笔记与总结(请先学习视频内容): 游戏开发入门(三)图形...

    视频链接:游戏开发入门(三)图形渲染(3节课 时常:约2小时20分钟)
    视频链接:一堂课学会shader——渲染拓展课程(3节课 时常:约1小时20分钟)


    笔记与总结(请先学习视频内容):

    游戏开发入门(三)图形渲染笔记:

    渲染一般分为离线渲染与实时渲染,游戏中我们用的都是实时渲染。

    1.实时渲染又可以分为2D渲染与3D渲染。
    早期的2D渲染,是通过把一块内存(图片像素数据)往另一块(显示缓冲区)上搬运的方式,实现图片绘制的。

    不过现在很多2D渲染的渲染方式已经采用3D渲染了。原因是当前显卡从架构上就利于并行处理,绘制速度更快,可以很方便提供各种3D效果,还节省图片资源内存。

    3D的渲染简单概括一下,就是把一个空间中的模型所有点的数据取出来,经过空间转换到2维屏幕上,然后根据各项参数与数据在绘制到屏幕上。

    现在几乎所有的游戏都是使用3D的渲染流程。

    2.3D渲染中基本单位就是顶点,顶点数据信息包括如下

    • 位置(相对模型位置)
    • 颜色(可有可无,可以在后面再处理)
    • 法线(主要是用于光照计算,可以知道哪边是背光)
    • 骨骼权重(一个点可能跟随多个骨骼运动)
    • 贴图UV

    3.MipMap 一般自动生成,远处的角色自动使用小的贴图,减少不必要的开销
    MipMap生成时由于边缘问题可能产生混色,所以一个贴图明显不同的地方可以留几个像素

    4.DX 微软的图形编程API,着色语言是High Level Shader Language(HLSL),只能在Windows使用
    OpenGL(OpenGraphicsLibrary) 着色语言是OpenGL Shader Language(GLSL)跨编程语言,跨平台

    5.DX8与OpenGL2.0以后就都支持可编程渲染管线
    vertexShader与pixelShader。现在更新的版本还支持GeometryShader

    6.ES2.0管线流程
    顶点buffer数据——Vertex Shader——PrimitiveAssembly(图元装配)—— 【如果有的话GeometryShader】 Rasterization 光栅化——Fragment Shader(即Pixel Shader)——PerFragementOperation——FrameBuffer

    7.ES2.0管线简述
    Vertex Shader
    顶点变换 移动,旋转,缩放,坐标系转换,投影变换
    光照计算 做法线变换和法线规格化
    纹理坐标转换 修改UV,偏移缩放等

    PrimitiveAssembly
    支持点,线,三角形三个图元
    三角形需要根据三个顶点装配成一个三角面
    执行裁剪,可以选择完全剔除,正面剔除或背面剔除(有些透明物体的渲染不剔除)

    GeometryShader
    对一组已经组成图元的顶点进行处理,可以改变图元类型和个数

    Rasterization 光栅化
    把一个矢量三角形变成一个位图图像(填充像素),每个顶点之间会通过颜色数据自动进行插值。

    Fragment(Pixel) Shader
    得到的是片元信息,即每个像素的深度颜色等,可以修改颜色也可改变像素的深度(z-buffering)。
    一个Pixel Shader不能产生复杂的效果,因为它只在一个像素上进行操作,而不知道场景的几何形状

    PerFragementOperation 片段测试,进一步筛选出不必要的信息,具体测试流程如下:

    • Pixel ownership test:测试该像素用户是否可见是否被其他窗口遮挡
    • Scissors Test:裁剪测试,判断是否在定义的裁剪区域内
    • Stencil Test:模板测试,决定了像素的颜色值是否要被写入到渲染目标 这个有点像PS里面的遮罩,相当于我用一个锅把桌子盖住,盖住的部分不渲染
    • Depth Test:深度测试,就是距离摄像机近裁剪面的距离,剔除深度高的
    • Blending:混合,对于特殊的材质(比如玻璃等半透明物体)
    • Dithering:抖动显示,就是用少量的颜色来表现更广泛的颜色的,可以到wiki上查一下https://en.wikipedia.org/wiki/Dither
    • FrameBuffer:最终的渲染数据

    8.HDR基本原理
    高动态范围图像(High-Dynamic Range),从表现上可以提供更高的色深、更广的动态范围和更强的色彩表现力,经常用来调整曝光。

    基本原理:现实最亮的物体亮度和最暗的物体亮度之比为10^8,人的肉眼识别的亮度信息只有10^5左右。但是显示器表示256种亮度。
    所以问题就是一般我们的显示设备的亮度跨度过大(而且人眼对不同亮度的敏感度也不同,参考伽马校正 https://en.wikipedia.org/wiki/Gamma_correction),所以需要一套校正显示器显示的系统,可以简单理解为HDR。

    9.为什么一个角色的衣服要在多个帧去渲染?
    因为不同位置的材质可能不同,其管线中的vertexshader等处理也可能不同,所以要分开绘制。

    10.常见的渲染效果

    • 全局光照:解决的核心问题就是如何很好地表现物体间的相互反射问题,最直接的问题就是如何找到一种更合理的方式来取代局部光照中的ambient(环境光),有多种实现方法,例如辐射度、光线追踪、环境光遮蔽(ambient occlusion)、Light Probe等
    • 阴影:比较流行的主要是shadow mapping和shadow volume。
    • shadow mapping基本原理是场景的深度渲染到一张深度缓冲区中,我们可以在场景中获得一张阴影或者无阴影的贴图,然后用这个深度图进行渲染。
    • Shadow volume基本原理是根据光源和遮蔽物的位置关系计算出场景中会产生阴影的区域(shadow volume),然后对所有物体进行检测,以确定其会不会受阴影的影响。
    • 扭曲:把一定范围的像素的UV进行扭曲

    11.后处理
    相当于对渲染完成后图片的处理,这个是对像素进行处理的,不在渲染管线的流程里面

    • AO:环境光遮蔽,描绘物体和物体相交或靠近的时候遮挡周围漫反射光线的效果,基本原理就是物体相交位置的深度不同,深度大的位置就变暗。现在游戏中比较常用的还有一个SSAO。

    • 模糊:有高斯模糊,径向模糊等,基本原理就是对一定范围的像素点的颜色进行平均混合操作。

    • 景深:Z值高达一定值就行像素虚化

    • 辉光(光溢出):某一点的颜色会扩散到他附近的屏幕空间,可以首先进行一次模糊处理,然后对模糊后的图片与原来的图片进行Alpha混合。

    12.材质、贴图、纹理
    贴图、纹理、材质的区别是什么?


    一堂课学会shader笔记:

    第一节课:
    1.Shader分为两种:
    vertex Shader, Pixel Shader

    2.在3D空间渲染中,一个贴图渲染其实与3D渲染相似,只不过他是有四个在一个平面的定点组成,把图的渲染(类似贴图) 信息取出来进行渲染。
    拓展:传统的2D游戏,是通过把一块内存(图片)往另一块(显示缓冲区)上搬运的方式,实现图片绘制的,
    渲染都是靠CPU的多媒体指令加速。举例来说,一个二维角色动画,可以通过制作其多个序列帧图片循环
    播放来实现。所以我们需要保存多个图片资源,加载时间长还占用内存。
    DX里面的Direct2D是在Direct3D基础上多出来的一层封装,借助Direct3D的功能实现了对底层硬件的直接访问
    从使用的接口上是简化了直接使用Direct3D实现2D效果的一些复杂代码,因此可以认为效率和3d相同,而使用方法上更简单了
    问:我们常见的UI的渲染走的是不是3D渲染管线? 是的。

    3.问:vs函数不写shader也会执行?默认管线里面的顶点处理与shader里面的是什么关系?
    答:默认可以不写shader,那么渲染管线就像传统管线一样正常输出。DX8与OpenGL2.0以后出现可编程渲染渲染管线,管线里面多出了VS与PS阶段。

    4.问:默认vertex Shader都进行哪些操作?
    答:vs默认就是处理顶点变换的,可以简单认为是将空间中的顶点坐标转为摄像机屏幕空间的顶点坐标,这里面涉及到多个转换。

    5.Shader函数执行是通过GPU执行的,而且是并行执行每个顶点的每个函数。

    6.问:顶点需要进一步进行图元装配变成三角形,图元装配怎么理解?在哪一步进行?
    答:图元装配就是根据一定数量的顶点装配成可以渲染管线可以处理的基本图元。在顶点处理之后

    7.三角形是最小的光栅化单元,光栅化简单理解就是把顶点数据“位图”化,从顶点转换为像素。
    要确定三角形在屏幕占多少个像素点,光栅化时所有的像素是没有颜色的。需要从贴图里面拷贝 颜色信息。

    8.PS函数,是针对像素来处理的,也是并行的。

    9.注意两种投影 透视投影perspective 与 正交投影 orthography。
    透视投影的过程简单理解就是,将一个视锥不断的压缩 ,得到的效果就是近大远小。正交投影就是无论从哪个位置看,大小都是一样的。

    10.关于景深图
    就是其Z值构成的,能也清晰的看到轮廓,原因就是一个Z值小的地方浅,边缘处 是其他物体Z值大。(0-1)

    11.Z值深度应用

    • a.景深效果 Z值高达一定值就行像素虚化
    • b.SSAO 屏幕空间环境光遮蔽
      发现如果当前位置与附近像素点的位置深度信息不同,深度大的位置就变暗

    第二节课:
    1.Render Texture(离屏渲染)
    渲染结果不仅可以到屏幕,也可以到图片上。虚幻里面有一个RenderTarget,原理相同。

    2.顶点处理MVP

    • Modeling Transformation(模型矩阵变换,模型点相对坐标转换到相对世界坐标,平移,旋转,缩放)
    • View(相对视角变换,世界坐标系一个点转换到摄像机坐标系里)
    • Projection(投影变换,挤压过程,比较复杂)

    3.Shader里面最简单的变换就是MVP
    将输入的顶点相对其模型的坐标,输出一个完成MVP变换的可以 与屏幕空间对应的二维坐标(结果是3维,另外两维可以认为无效)

    4.DX9之前,渲染管线是几乎固定的,我们无法使用shader参与中间过程的渲染

    5.对于某些顶点,我们直接返回其在屏幕上固定的坐标,可以实现类似UI的效果

    6.VS函数可以用来处理蒙皮骨骼动画,根据权重处理渲染

    7.CPU与GPU架构不同,互相不能访问显存与内容

    8.CPU一开始会得到模型的顶点等数据,需要UpLoad到GPU,然后GPU去处理
    这个UPload过程不能频繁进行,因为顶点数据是很多的,所以一般渲染时我们看到模型在变化,其实在CPU他的位置是没变的

    第三节课:
    1.BillBoard广告板的效果实现原理:
    效果就是一个物体永远对着摄像机。原理是先做MV处理,在投影前把广告版强制沿着摄像机视窗平面展开
    使图像一直对着摄像机,然后再做投影变化P处理。

    2.shader传入的参数可以自己规定

    3.图元装配细节
    一个VertexBuffer作为顶点缓存,一个IndexBuffer作为索引缓存,然后索引缓存里面,每三个顶点对应一个三角形(顶点顺序不能反)

    4.光栅化是一个有损的过程
    把一个矢量三角形变成一个位图图像,每个顶点之间会通过颜色数据自动进行 插值。

    5.UV
    UV就是我们每个渲染顶点对应图片的坐标位置,渲染的时候需要根据当前顶点的UV数据去图片上找到对应的颜色信息。

    6.采样
    属于光栅化的一个步骤,就是上面描述的根据UV从图片对应位置取颜色信息

    7.VS函数的输出就是PS函数的输入,PS函数输出的是颜色值

    8.由于顶点的数量是有限的,PS得到的UV信息需要在VS里面经过插值处理

    9.FilterMode

    • Point采样(只在指定位置采样)
    • Bilinear采样(附近4个位置采样)
    • Trilinear(两次,一次在精细图四个位置采样,第二次在小的图四个位置采样)

    10.shader应用

    • 裁剪图片
    • 马赛克(先扩大100倍,取值后缩小忽略小数点,有的只重复会被忽略)
    • 阴影(从光源方向加一个摄像机,先渲染一遍记录深度。最终渲染利用这个信息)
    • 全屏泛光(可以影响模型之外的像素,从当前像素附近取其他像素颜色进行调整)
    • UI处理 可以直接丢弃某些位置的渲染,实现拼图功能

    11.减少采样有利于性能的提升


    上一篇:游戏开发入门(二)游戏中的设计模式
    下一篇:游戏开发入门(四)逻辑与脚本开发

    原文链接(转载请标明):http://blog.csdn.net/u012999985/article/details/79090657

    展开全文
  • 关于Unity中2D游戏,同图层渲染顺序问题 有时候做2D游戏时会出现如下问题 我们希望在同图层的物体能够根据Y轴来判断图片渲染顺序。 达到这样的效果: ...因为是2D游戏渲染先后循序与z轴无关,所以改成y轴。 ...
  • 一些游戏用到的渲染技术

    千次阅读 2018-05-18 21:19:57
    泡泡网显卡频道2月19日 近年来3D图形技术的发展势头非常迅猛,软件方面游戏的画面和逼真度有了长足进步,硬件方面显卡的更新换代越来越频繁。但始终存在这样一个现象,无论显卡的性能翻多少倍,游戏玩家们总感觉还是...
  • 游戏中水的渲染技术系列一

    千次阅读 2017-03-18 16:24:53
    已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。CSDN视频网址:http://edu.csdn.net/lecturer/144 水的渲染一直是图形学需要解决的问题,网上也有很多关于...
  • Unity游戏中的图形渲染优化

    万次阅读 2018-02-20 10:29:48
    Unity游戏中的图形渲染优化 转载自:Unity游戏中的图形渲染优化 技术文章翻译 原文链接 Unity官方教程中的一篇文章,虽然讲得不深,但是比较系统全面,对寻找问题,优化性能还是有帮助的,分享给大家把。...
  • 3D游戏引擎之GPU渲染(DX篇)

    万人学习 2015-04-16 17:03:06
    本次课程主要是针对3D游戏引擎内部的GPU之Shader渲染处理,告诉大家引擎底层是如何与Shader代码结合的。从基本的灯光渲染,环境渲染到后的Bloom渲染
  • 三维游戏引擎开发-渲染

    万人学习 2015-04-12 20:28:28
    介绍移动设备,介绍一款游戏引擎具备的要素,并依次进行开发实现,采用标准C++语言进行开发,需要有扎实的C++基础
  • Unity2D游戏层级渲染问题

    千次阅读 2019-01-05 14:44:37
    学习了几个月的课程,期末做个游戏,各种问题,查阅资料,发现全是以前犯过的错,唉,不说了,先做个笔记! 解决图片层叠在一起时的渲染问题,一般情况下,我们只需要用到Order int Layer属性,该值越大,越后渲染,...
  • 3Dmax基础:游戏建模渲染小技巧

    千次阅读 2020-05-13 21:18:15
    我们平时在使用3DMax创建好一个模型后就需要给我们的模型添加材质贴图,以及灯光特效等,今天小编就来和大家说说我们使用3DMax怎么进行渲染。 3D模型 首先,我们打开3DMax软件,进入到3DMax的操作界面 3D...
  • 游戏中的渲染器架构

    千次阅读 2007-12-24 14:11:00
    作者:Kevin Lynx这里的“游戏”我只讨论一般的小游戏,这里的渲染器也特指游戏中负责所有(或者说大部分)渲染工作的那个对象。而我这里说所的“架构”则是指如何安排这个“渲染器”与游戏中其他对象(类)的关系,...
  • PBR是最近游戏渲染领域中比较高级的渲染管线。相比于传统基于Lambert以及Phong模型的渲染管线,PBR采用更加真实的材质模型,能够更好地表现物体表面不同粗糙度带来的不同反射效果,从而能够更贴近真实地模拟各种不同...
  • 浅谈游戏开发中逻辑与渲染的分离

    千次阅读 2019-03-26 17:39:27
    为了更清晰,NRatel将一个游戏对象类拆分为两个类,如下: 1、定义“纯粹的逻辑类”。 基本职责:对游戏对象的“逻辑值”进行定义、存储和计算。 关键要素:只关心逻辑数据,不考虑渲染问题。(如同在没有渲染...
  • 游戏中基于物理的渲染

    千次阅读 2012-05-27 08:25:06
    游戏中基于物理的渲染”系列由4-5篇文章组成,介绍了如何在实时渲染中使用基于物理的方法。内容主要来自于SIGGRAPH 2010的course:Physically-Based Shading Models in Film and Game Production。本系列文
  • 嘉宾们分享了GPU框架特性、移动游戏性能与功耗优化技巧,以及3D效果渲染技巧等话题。 5月18日,Qualcomm在北京举行Qualcomm骁龙游戏与图形开发者研讨会。Qualcomm创新工程中心高级工程总监Zack Zhou、Qualcomm...
  • 游戏中的角色渲染技术之皮肤篇

    千次阅读 2017-06-21 10:18:20
    游戏中的角色渲染技术随着近几年来硬件机能的增长已经被大范围地应用在了各类AAA大作中,本文会取一些游戏为例,分类概述游戏中的角色渲染技术。由于整个角色渲染的话题会比较长,这个主题会用两篇来阐述,第一篇...
  • 游戏实时渲染中HDR入门介绍

    千次阅读 2017-01-20 14:08:43
    游戏实时渲染中HDR入门介绍 虽然HDR这个概念绝大多数做游戏的人都知道了,不过可能有的人会像我一样一直对这个概念一知半解,这里做下学习笔记,省的以后又忘了= = 1. 到底什么是HDR? 这个概念大概...
  • 游戏中各向异性头发的渲染

    万次阅读 2017-11-03 16:29:33
    趁有时间写一篇关于各向异性头发的渲染。 先上效果图(不含Ao)。 这个是04年的一个ppt,主要介绍了头发的渲染,其追到源头还是要看这个原理。 各向异性的主要计算公式: 主要代码如下...
  • 本章我们要实现hook游戏渲染过程,把渲染自机换成播放bad apple(只是我看了别人的视频想自己做一个,没什么实际意义,但是可以说明怎么修改指定物体的渲染
  • 3D游戏技术 - 大型3D地图优化渲染技术

    万次阅读 多人点赞 2013-11-30 08:22:53
    那就必须想办法提高渲染速度,也就是帧率(FPS)要提高,才能使得游戏流畅。 会用到的相关技术会有: 1 地图分块剔除 2 kd树 3 BSP树 4 LOD技术 等等,最后把场景优化到极致,才能创造出伟大的游戏。每一种技术...
  • Unity中UI和游戏物体之间的层级渲染

    千次阅读 2017-10-15 22:26:18
    之前使用一个UICamera和一个MainCamera做场景,希望给场景加上一个BackGround,但是将BackGround和操作的UI都绑在UICamera,将游戏物体正常地用MainCamera渲染时,出现了游戏物体遮挡住Button或者BackGround直接遮挡...
  • Pascal游戏开发入门(二):渲染图片

    千次阅读 2020-10-13 15:13:46
    Pascal游戏开发入门(二):渲染图片 渲染静态图片 新增一个Texture,然后Render出来 创建Texture,并获取尺寸 procedure TGame.Init(title: string; x, y, h, w, flags: integer); begin ..... pt := IMG_...
  • 对电脑性能有特殊要求的群体,比如图形设计人员,亦或者是游戏玩家,往往对电脑性能越来越关心,以为配置决定工作效率和游戏流畅度体验。对于学设计的同学,常常会在选择电脑的时候纠结一个问题,3D建模和3D渲染吃...
  •  游戏引擎剖析 原文作者:Jake Simpson 译者: 向海 Email:GameWorldChina@myway.com  第1部分: 游戏引擎介绍, 渲染和构造3D世界 介绍 自Doom游戏时代以来我们已经走了很远。 DOOM不只是一款伟大的游戏,它同时...
  • 而对于设计师来说,常常纠结一个问题,3D建模和3D渲染吃什么硬件?专业图形显卡和游戏显卡区别?下面装机之家为广大装机用户解答一下。 专业图形显卡和游戏显卡区别 所谓的游戏显卡就是针对游戏优化的一种显卡,它...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 96,801
精华内容 38,720
关键字:

游戏渲染