上一篇讲到了如何填平OpenGL和D3D之间一些原本被认为位于底层的区别。本篇将剖析两个API在功能上的异同,以及直接相互访问的可能性。
功能
D3D9的功能早已被OpenGL 2.0所覆盖,网上可以找到很多资料,这里就不提了。本文注重的是新的GPU特性。下表列出了D3D10+的新功能,以及实现该功能所需要的OpenGL扩展或核心。
D3D 10的功能
OpenGL所对应的
Geomrtry shader
GL_ARB_geometry_shader4或OpenGL 3
Stream output
GL_EXT_transform_feedback或OpenGL 3
State对象
无,需要在上层封装GL_EXT_direct_state_access
Constant buffer
GL_ARB_uniform_buffer_object或OpenGL 3
Texture array和新的资源格式 ...
上一篇提出了跨越OpenGL和D3D的基本问题,介绍了一些能在不改变API的情况下,通过输入数据来消除OpenGL和D3D之区别。本篇的重点是如何利用现代OpenGL提供的扩展和新功能,消除一些无法在上层解决的问题。
顶点颜色顺序
D3D9 最常用的顶点颜色格式是BGRA格式(也就是D3DCOLOR),而OpenGL默认用的是RGBA格式。D3D9用BGRA纯粹是因为历史原因,早期硬 件不支持UBYTE4的格式,只能用D3DCOLOR,然后再shader里调用D3DCOLORtoUBYTE4。现在的GPU都支持 UBYTE4,D3D10+也是可以直接使用RGBA,所以这已经不是问题了。
如果需要兼容已经生成BGRA格式数据,现代OpenGL提供了GL_EXT_vertex_array_bgra这个扩展,也可以使用BGRA作为顶点颜色输入格式 ...
多年来,在论坛和各个网站上不断能看到拿OpenGL和D3D进行比较的帖子和文章。他们经常制造很多谜思,使得初学者和一些从业人员对OpenGL和D3D产生了各种各样的流言。
有人说,OpenGL直接调到驱动,性能高于D3D。
有人说,Shader都得写两套,很麻烦。
有人说,OpenGL和D3D在底层有很多区别,而且不可设置。
有人说,图形引擎如果要兼容两者,就只能取其功能的交集,最后还不如任何一种API。
真的么?
本文试图:
找出现代OpenGL和D3D的共通之处
归纳如何让API对上层代码尽量透明
本文不希望:
讲解函数间的对应关系
如何在OpenGL和D3D之间作选择
贬低一方,抬高另一方
下面先从几个比较基本的方面来探讨如 ...
上一个帖子提到了在Catalyst 11.4上,KlayGE的OpenGL插件黑屏的情况,现已查明是因为AMD和NVIDIA的GLSL不兼容的原因。NV的驱动上fragment shader可以定义varying out vec4 v_gl_FragData[8]这样的输出数组,但AMD的驱动上不支持。所以我再次修改GLSL生成器,把数组拆成独立变量,解决了问题。但实际上AMD的GLSL预定义了out vec4 gl_FragData[],所以变成预定义可以,自定义不行的情况。估计得等以后他们自行解决吧,目前只能先绕开了。
上一个帖子提到了在NV 270.xx驱动上,OpenGL MRT出问题的情况。经过一些单元测试,我发现那不是个驱动的bug,而是270系列驱动对GLSL的实现更加严格了。在GLSL 1.3,也就是OpenGL 3.0上,gl_FragColor和gl_FragData都被标记为deprecated。原本的驱动仍旧提供了对它们的支持,但270.xx去掉了gl_FragData,所以在需要MRT的时候就得自己定义varying out了。在对GLSL生成器做些许修改之后,KlayGE在OpenGL插件上的MRT都恢复了正常。
继前几天的270.51 Beta之后,NVIDIA正式发布了270.61 WHQL。这标志着NVIDIA已经开启了270系列驱动的大门。这款驱动支持GeForce 6以来的所有桌面Geforce GPU,以及ION桌面GPU。在API方面,它在Geforce 400+的显卡上支持OpenGL 4.1,之前的显卡只支持OpenGL 3.3。在OpenGL扩展方面,和之前的270.51 Beta一样。下载链接:
Vista / Win7 64-bit
Vista / Win7 32-bit
XP 32-bit
XP 64-bit
在使用的过程中,我发现270系列驱动在OpenGL下的一些问题。首先是它去掉了对GL_EXT_transform_feedback的支持。所以要么退回到GL_NV_transform_feedback,要么前进至OpenGL 3.0提供的transform feedback。另一个可能是bug的地方在于,MRT虽然可以调 ...
最早出现的270系列驱动是GPU Computing注册开发人员才能下载到的CUDA 4.0 RC驱动。现在270.51 BETA已经可以从NVIDIA网站下载了:
Win7/Vista 64 Bit
Win7/Vista 32 Bit
WinXP 64 Bit
WinXP 32 Bit
在270系列驱动里,除了支持CUDA 4.0之外,另一个有意义的功能是对OpenGL ES的增强。自从OpenGL 4.1明确提出对OpenGL ES的支持以来,AMD和NVIDIA的驱动都加入了对OpenGL ES的支持。实际上AMD在那之前就已经部分支持了。这次NV新增的扩展有27个:
GL_EXT_texture_compression_dxt1
GL_EXT_texture_format_BGRA8888
GL_EXT_texture_type_2_10_10_10_REV
GL_NV_alpha_test
GL_NV_blend_minmax
GL_NV_complex_primitives
GL ...
在GLIntercept 0.5了那么多年之后,1.0 Beta终于出了。GLIntercept在功能上类似gDEBugger,可以拦截OpenGL 1.0-2.1的函数调用,然后:
把所有的OpenGL函数调用保存到文本或者XML格式,用来记录每一帧。
在运行期显示和编辑shader。支持ARB VP/FP/GLSL和NV VP/FP。
改摄像机。自由浏览发给显卡的几何信息,打开/关闭线框模式/背面剔除/视锥。
保存和跟踪纹理。(支持绑在1D、2D、3D、NVRect和p-buffer上的纹理。)可以保存成TGA、PNG和JPG格式。
保存和跟踪shader/program。0.41开始支持ARB VP/FP/GLSL和NV VP/FP。
保存和跟踪display list。
在render call之前和之后保存OpenGL frame buffer (color/depth/stencil)。可以保存之前和 ...
上个月的一篇帖子提到了ATI OpenGL驱动的一些陷阱,随着ATI驱动每个月的新版本不断发布,这些问题是否得到改善呢?
glBlitFramebufferEXT
情况一样,没有任何变化,还是没法用:(。
glClearBuffer*
WTF,没有任何变化,还是没法用。
glBeginConditionalRender
已经改进!如果glBeginConditionalRender和glEndConditionalRender完全严格地配对使用,就能正常工作,不会造成恐怖的死锁。如果一旦不小心没有遵循配对使用的规则,照死锁不误。NVIDIA的驱动上不配对也没发生任何错误,虽然确实不该那么用。
新发现的问题
在改进海洋渲染的过程中,displacement texture从ABGR16f改成了ABGR8,结果在ATI OpenGL的情况下一片平坦。经过其他测试后的结 ...
前几天的帖子提到过gDebugger的新版本是免费的。现在,新版本5.8终于来了,只要注册就可以免费使用1年,也不是永久免费的。下载地址见:http://www.gremedy.com/free_license.php。