Skip to content

Archive

Category: OpenGL
上一篇讲到了如何填平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。