这几年Intel和AMD都推出了集成GPU的消费级CPU,并强调它们的内存是共享的架构,也就是UMA(Unified Memory Architeture)。最近AMD和NVIDIA的独立显卡也加入战团,开始逐步支持UMA。最新的D3D12直接内置了UMA的支持,开发者可以让自己的程序充分利用上UMA所带来的优势。那么UMA能带来什么好处?它的限制在哪里?
各种平台的状况
自从PC上第一块GPU,NVIDIA Geforce 256问世以来,GPU一直都是自带一块显存的。当年的AGP总线是非对称的设计,数据传到GPU要远快于从GPU读回。CPU和GPU的访存是完全分开的。后来的PCIE总线让两端传输的速度相等了,并提供了一些相互访问的能力。在驱动里,system memory的区域可以映射成可以被GPU访问的,反过来 ...
[zh]三年前,我就曾经计划过一个KlayGE的长期研发子项目,D3D11 HLSL字节码到GLSL的编译器。两年前,在d3d1x for linux代码的帮助下,基本的字节码解析和反汇编工具已经实现。如今,这个子项目被正式命名为DXBC2GLSL,在库和工具两个层面上提供HLSL字节码(DXBC)到GLSL的转换。2013年底,DXBC2GLSL支持VS和PS初始版本已经由团队新成员林胜华完成,并提交到开发版本中。GS的支持也已经在上个月加入。当前所有KlayGE中的shader已经全部通过测试。[/zh]
[en]Three years ago, I've planned a long-term R&D sub-project of KlayGE, D3D11 HLSL bytecode to GLSL complier. Two years ago, derived from d3d1x for linux, a simple bytec ...
[消息来源]
在正在举行的GDC 2014上,Khronos发布了OpenGL ES 3.1的规范。总体来说,OpenGL ES 3.1以OpenGL 4.4为蓝本,把一些原本是桌面API的功能带到了移动平台。
OpenGL ES 3.1的新功能包括:
Compute shader:GLSL ES也开始支持compute shader了,和桌面API取齐。来自OpenGL 4.3。
分离式shader:可以分开绑定不同stage的shader。来自OpenGL 4.1。
间接绘制指令:允许从一个buffer object提供Draw的参数,而不用倒回CPU发起Draw。来自OpenGL 4.0。
增强了纹理的功能:包括multisample的纹理、stencil的纹理,以及在纹理上执行gather操作一次读取4个像素。来自OpenGL 4.1和4.3。
着色语言的改进:新的算术和位域操作, ...
上一篇我们提到了SSSSS,作为本系列的最后一篇,本文将介绍KlayGE 4.4的OpenGL和OpenGLES插件的改进。
OpenGL 4.4
KlayGE在OpenGL方面一直是紧跟spec的步伐,这次也不例外。在八月份OpenGL 4.4发布的时候,glloader和KlayGE的OpenGL插件就很快加上了4.4的支持。并且这次把代码彻底过了一遍,很多原先通过扩展实现的功能,都尽量替换成用核心实现的,提高兼容性。
经过测试,OpenGL插件在NV和Intel的显卡上所有例子都能正常工作。
OpenGLES 3.0
虽然GLES3出了有一段时间了,但硬件支持度和开发环境都还没跟上,所以原先OpenGLES插件只支持2.0。这次尝试了PowerVR和Mali的OpenGLES 3模拟器,觉得还行,就加上了GLES3的支持。Adreno的模 ...
D3D11.1和OpenGL ES都提供了discard frame buffer的方法,分别成为DiscardView和GL_EXT_discard_frame_buffer。虽有文档,但却很少有例子来表达这功能在什么情况下使用。这里我只能根据我的理解做一些探讨。希望有更了解的朋友可以一起讨论。
从tile-based说起
移动平台上最常见的GPU架构是tiled-based。它把frame buffer划分成许多大小相同的tile。每个rasterizer一次处理一个tile,把这个tile中包含的三角形光栅化到那个区域。为了提高性能、减少功耗,tile-based硬件会有一个片上空间,真正的光栅化仅仅发生在这个片上空间,当一个tile的所有三角形都渲染完成之后,才写入位于video memory的frame buffer。可以认为,那个片上空间是个ca ...
从Android SDK R17开始,模拟器就支持OpenGL ES 2。如果能让KlayGE在模拟器上跑起来,开发和测试就能方便许多。于是我装了最新的R21和Android 2.1的ARM v7a的镜像,经过几个小时的努力,终于成功执行了一些原来能在Android x86 2.3上跑的简单例子。途中发现了一些小陷阱,这里总结一下。
屏幕宽高
原先我的做法是通过ANativeWindow_lock获得buffer,再拿buffer的width和height。在ICS上,这么做会导致后面eglCreateWindowSurface失败。原因似乎是ANativeWindow_lock之后这个窗口就被连到2D API,那么在eglCreateWindowSurface的时候就会说那个窗口已经被别的API连接了。即便是ANativeWindow_unlockAndPost也没用。解决方法是改成用ANativeW ...
在OpenGL 4.3发布的同时,Khronos同时宣布了OpenGL ES 3.0。由于从OpenGL 3.3和4.2里吸取了大量内容,OpenGL ES 3.0给移动平台带来了许多原本只有桌面才有的功能。其中包括:
对渲染流水线的多项增强,用于加速高级视觉效果:遮挡查询、transform feedback、instanced rendering和支持4个或更多render target。
高质量的ETC2 / EAC纹理压缩成为标准,这样就不再需要给每个平台不同格式的纹理。
新版本的GLSL ES shading language,完整地支持整数和32位浮点操作。
极大地增强了纹理功能,包括保证支持浮点纹理、3D纹理、深度纹理、顶点纹理、NPOT纹理、R/RG纹理、固定纹理、2D纹理数组、通道交换、LOD和mip level钳制、无缝cube ma ...
从KlayGE 4.0开始,不但有为了下一版本开发的短期任务,还有一些中长期研发的任务。其中之一就是HLSL bytecode to GLSL编译器。现在KlayGE里的shader主要由HLSL写成,通过#ifdef的土办法兼容Cg。对D3D11来说可以直接使用,但对于OpenGL和OpenGL ES 2就得大费周折了。那种情况下,shader需要经过Cg编译器编译成传统的GLSL,在经过我自己的token级别的编译器转换成现代的GLSL,然后才能使用。
为什么不直接用Cg?看看Cg runtime在ATI卡上的表现吧。
为什么不用传统的GLSL?NV的驱动有一套attribute和index之间的绑定规则,比如gl_Position一定是0,gl_Normal一定是6(或者某个数,但是个常量),而且无法通过API来获取预定义attribute的i ...
[zh]
经过长时间的筹划,今天正式宣布开始次世代评测软件KlayMark的开发。
简介
KlayMark将以KlayGE为引擎,定位为一款集各种先进渲染技术于一身的跨平台评测软件。在提供赏心悦目的画面同时,对系统的性能作出综合评价。不论是PC平台还是移动平台,KlayMark将提供统一的计分方式,使得不同平台之间的得分具有可比性。
虽然动用到许多新技术,但KlayMark仍会保持极高的效率、较低的配置、良好的跨平台能力等特点。
发布计划
KlayMark的源代码将迟于二进制版本发布,类似Doom和Quake的方法。
由于平台的差异,KlayMark 1.0的发布将分拨进行。
Wave 1:预计开发周期1年。Windows平台支持D3D10+和OpenGL,Android平台支持Tegra ...
为迎接即将到来的OpenGL ES 3.0(开发代号Halti),KlayGE的OpenGLES2插件正式更名为OpenGLES,以保持兼容性。同时,还增加了OGLESConditionalRender,通过GL_EXT_occlusion_query_boolean来实现遮挡查询。
另外说说OpenGL ES 3。在2007年的OpenGL ES Overview里面就有提到代号为Halti的OGLES3,是基于OpenGL 3.0来开发,目标发布时间是2010年。但现在显然延期了很久。终于,在前不久的CES2012上,Imagination Technologies宣布了PowerVR6,支持OpenGL ES 3、OpenGL 3、D3D 10和OpenCL。特定型号还可以支持D3D11.1和OpenGL 4。之前ARM也宣布了Mali-6xx支持OpenGLES 3、D3D11和OpenCL 1.1。同样,Qualcomm的Adreno 3xx也会支持OpenGL ES 3 ...