昨天微软发布了Windows 8.1 Preview,其中一个没怎么被发现的新功能是,DirectX 11.2!上一次DirectX出现.2的版本号还是在8.x时代吧。DirectX 11.2引入了以下新功能:
HLSL shader linking:Shader可以分成小块,分开编译,连接后成为完整的shader。给模块替换提供了方便。甚至,在11.2中还提供了一个叫Function linking graph的功能,可以像offline shader那样,构建一个graph,每个节点是一小段shader。最后才link了送给GPU。
Inbox HLSL compiler:Win8的时候,shader编译器是个独立的dll,在metro里面不允许调用,得离线编译。现在编译器又回来了,D3DCompile都可以在metro和desktop里使用。
GPU overlay support:直接支持在3D ...
IE 10 for Windows 7在发布的时候,包含了一个补丁KB 2670838,给Win7带来了DirectX 11.1和DXGI 1.2的部分能力。这个补丁也可以在不需要IE10的时候单独安装。详细的更新内容在这里。比较有意思的是,WARP被升级到支持feature level 11.1了。
很遗憾的是,如果装了KB 2670838,PIX for Windows和D3D11_CREATE_DEVICE_DEBUG会受影响,因为DirectX SDK (June 2010)的debug runtime和KB 2670838不兼容。解决方法是安装Windows 8.0 SDK standalone,或者升级到使用Win8 SDK的VS 2012 Update 2。
Surface的GPU是Tegra3,但它对应的D3D能力,在网上却很难查到。昨天我自己在Surface上执行了一下Windows Kits 8带的ARM版dxcapsviewer,dump出了这个文件。我已经去掉了Microsoft Basic Renderer Driver和WARP这两个和PC上相同的部分,就剩下Tegra3本身的。
从这个列表可以看出,Surface只能支持D3D_FEATURE_LEVEL_9_1。估计是因为Tegra3不支持完整的occlusion query,以及最大纹理只支持到了2048,必须放弃9_2和9_3。很可惜的是MRT的功能也因此被禁用了。
昨晚在升级了Intel和NV的显卡驱动之后,突然发现原先在程序中启用Optimus的NvOptimusEnablement失效了。及时回滚到老的驱动,仍无法解决问题。试了多种方法之后,最终发现在NV Control Panel的Manage 3D Settings里面点一下Restore,即便在UI上看不出什么,但NvOptimusEnablement恢复了作用!之前尝试失败的朋友不妨也用这个方法试试看。
NVIDIA的Optimus技术可以在笔记本上兼顾耗电量和性能,并能做到自动无缝切换。但问题就在于,不想让它自动的时候,该怎么办?在ThinkPad T420s上,NV的独立显卡是NVS 4200M,feature level支持到D3D 11.0;Intel的集成显卡是HD 3000,feature level支持到D3D 10.1。(对feature level还不熟悉的朋友可以看这篇)
在BIOS中控制
支持Optimus的平台上,在BIOS中可以找到选项,可以选择使用NV、Intel或者自动切换。但这个是静态的,每次切换都得重启,肯定不是我们想要的。
在右键菜单中控制
在exe文件的图标上按右键,菜单里有一个“用图形处理器运行”的项,里面可以选择NV卡或者Intel卡。有趣的是,如果你在程序中枚举adapter,总会返回两块 ...
在The Valve Linux Team的博客上看到他们把Left 4 Dead 2移植到Linux,并通过一定的优化,使得速度神奇般地超过了Windows OpenGL和Windows D3D(315 FPS vs 303.4 FPS vs 270.6 FPS)。原文在这里。他们还分析了Windows上OpenGL和D3D的性能差异,结论是在每个batch,OpenGL驱动都比D3D少了一个几毫秒开销。
不过这里比较的应该是D3D9,如果用D3D11的话情况可能会有所区别。毕竟,D3D11的调用开销远小于D3D9,API call的数量也少得多。
经过两天的努力,手写的ResizeTexture已经取代了D3DX11LoadTextureFromTexture和D3DX11FilterTexture,成功地去掉了所有D3DX的依赖(去掉的原因在此)。同样,原先glu里面我也只用到了gluScaleImage,现在也被替换了。
另一个改动是把D3DReflect的调用彻底挪到了shader JIT中。这样不但提高了载入速度,还去掉了运行期对D3DCompiler_xx.dll的依赖。
现在的KlayGE离Metro-ready越来越近。Windows的ARM版不能完全支持所有传统的Windows API,仍然需要对程序做一些改动才能支持。目前的障碍在于由于ARM没有注册表相关的函数,Python无法顺利地通过VC11编译成ARM版。影响了KlayGE核心的移植。不知道大家有没有什么办法对付这个问题。
自从DX9 SDK提供了D3DX的库之后,相信D3DX一度成了所有相关开发人员必不可少的库。但随着时间的发展,D3DX慢慢被拆散、重组,出现了XNAMath、DirectXTex、D3DCompile之类独立的组件,逐渐取代了D3DX的功能。
现在,DX SDK早已不再更新,被合并到了Windows SDK中。D3DX也彻底退休。虽然你仍可以通过使用DX SDK June 2010来支持D3DX,但Metro风格的新程序就没法那么做了。所以,从现在开始应该逐步减少对D3DX的依赖。
在KlayGE中,出于可移植的原因,从多年前就开始减少使用D3DX了。最先是用自己实现的模板数学库MathLib代替了D3DX Math,接着D3DXEffect这种重量型的框架也被自己实现的更高效的特效管理系统所取代。关于字体渲染,我就不 ...
2年前,D3D11显卡刚出来没多久的时候,我曾经做过一个《NV GTX480对ATI HD5870:另一个视角》,用DX SDK的D3D11例子来对当时巅峰的显卡进行各个单项的性能评测。时过境迁,现在NV GTX680已经上市,硬指标对比如下表所示。
GTX 680
GTX 580
制程(nm)
28
40
晶体管数量(Million)
3540
3000
Die大小(mm^2)
294
520
显存(MB)
2048
1536
SM数量
8
16
核心配比
1536:128:32
512:64:48
核心频率(MHz)
1006-1058
772
shader频率(MHz)
N/A
1544
显存频率(MHz)
6008
4008
像素填充率(GP/s)
32.2
37.06
纹理填充率(GT/s)
128.8
49.41
...
在越来越多的人讨论Cg存留问题的时候,Cg 3.1突然发布了。主要的改进有:
Cg语言支持uniform buffer。
增加了OpenGL Unified Buffer Object(UBO)。
增加了翻译成OpenGL GLSL version 110和120的支持。
新的tessellation例子。
新的uniform buffer例子。
各个例子都加上了VC10的工程文件。
不知道NV怎么了,给出来的下载链接居然是错误的。正确的是http://http.developer.nvidia.com/Cg/cg_3_1_0010.html,有兴趣的朋友可以看看。