【原创】硬件加速的PowerVR光线追踪API

 

本文我将对PowerVR光线追踪团队创建的API进行简要介绍。该API允许开发人员访问Wizard架构的P...



本文我将对PowerVR光线追踪团队创建的API进行简要介绍。该API允许开发人员访问Wizard 架构的PowerVR光线追踪硬件。我将简单概述硬件层发生的物理变化及其相比传统的GPU所变化的具体内容。随后,我将着重讨论新创建的供开发人员访问硬件的OpenGL ES 3.1扩展程序。

在2016年度游戏开发者大会(GDC)上,Imagination的 idc16开发人员会议对API进行了讨论,点击此处可获取API讨论资讯。

以下内容的前提是默认各位读者已经了解光线追踪的概念。若不了解,可以先查阅光线追踪的相关信息。本文不会深入探讨每个功能,详细的信息将在后续的文章中进行讨论。

前一段时间,我们介绍了启动光线追踪功能的四核集群PowerVR GR6500 GPU。最近,我们又展示了一些目前在GPU上运行的光线追踪应用程序。

下图是我们添加的用于加速光线追踪的硬件功能:

图表展示了光线追踪新的硬件模
光线数据管理
光线数据管理(RDM)模块将交叉点归至统一着色集群(USC)中,再由集群进行光线着色

场景层级生成器
场景层级生成器(SHG)模块即使用标准顶点着色器生成的世界坐标顶点,在光线交点处理器之后生成加速结构。

相干引擎
该模块是光线追踪装置(RTU)的一部分,并以相同的方式缓冲了一组遍历场景层级的光线且遵循类似的执行路径。这样,在内存中获取光线数据时便可以避免缓存缺失,并由此减少带宽和功耗。更多信息将在后续文章中详细介绍。同时,您还可以关注2014GDC论坛获取更多相干引擎的资讯。

光线交叉处理器
该模块是RTU的一部分,可以测试SGH生成的位于主内存的三角形光线及场景层级光线。

帧累加缓存
该硬件模块从USC中获取累积指令,并使用编写的缓存来加速某些在光线追踪着色器中可以使用的图像原子操作。这意味着我们可以发出只编写指令,这些指令将异步列队并执行。

PowerVR GR6500 GPU在PCIe卡上进行集成,如下图所示,使用RTU时其峰值性能为每秒3亿光线。SHG的目标是生成加速结构,使顶点输出从每秒1亿动态三角形开始加速。
The API

光线跟踪硬件对典型的GPU设计进行了延伸,使之不仅仅只是单一的硬件。我们决定通过添加光线追踪功能来扩展OpenGL ES 3.1,以充分利用这个开发人员较为熟知的OpenGL ES API。我们选择使用现代规范,如直接状态访问、无绑定等,因为预计这将是未来的API模式。Vulkan API的潜力不容忽视,但Vulkan仍处于待开发中,本文只介绍OpenGL ES扩展。

● 顶点处理

光线追踪器输入与光栅输入是不同的。光线追踪器处理的是世界坐标中的对象,这是因为光线追踪器需要访问整个场景。例如,其场景中的对象反映的摄像机获取的某个对象,而光栅中这却很难处理。

正因为如此,PowerVR硬件光线追踪API处理顶点输出时是在世界坐标而非光栅的剪辑空间中。这意味着我们将要以不同的帧率运行各层的顶点至光栅中——在光栅中,摄像机通常从帧到帧移动。即便不是,大多数游戏平台也将重新渲染场景,因为传输过程中某些信息发生了改变。

这不同于光线追踪器。我们从摄像机运动中解耦,在应用程序启动时运行顶点着色器,随后,如果场景中没有任何对象在世界坐标中发生移动,则无需再次运行顶点着色器。当然,当摄像机移动时,仍然需要在每一帧进行光线遍历,但为场景静态部分生成的场景层级则无需如此。

预期OpenGL ES的变量及其他特性运行如下:

layout(std140, binding=0) uniform UboPerObjectIn {
highp mat4 worldFromModel;
highp mat4 worldFromModelIT;
} UboPerObject[2];

out gl_PerVertex {
vec4 gl_Position;
float gl_PointSize;
};
out PerVertexData {
vec3 vertexNormal;
};
void main() {
gl_Position = UboPerObject[gl_BuildIDIMG].worldFromModel * vec4(inVertex, 1.0); // Output in world space
vertexNormal = (UboPerObject[gl_BuildIDIMG].worldFromModelIT * vec4(inNormal, 0.0)).xyz

(gl_BuildIDIMG explained below)

然而,由于世界坐标中的顶点处理与光栅顶点处理不同,因此我们需要不同的API来进行顶点处理……

● 场景构造

对顶点和变量进行处理时将生成对象的坐标位置,使用该位置便可以生成场景层级加速结构。光线遍历阶段需要使用此加速结构。计算加速结构工作量相对较大。这就是为何在硬件中设计了场景层级加速器模块——可以有效地生成场景层级加速结构。我们还设计了API,这样开发人员就可以将场景分为组件、组件集、场景和场景集。

这样分解使得开发人员得以更有效地使用硬件。
当我们发出构建命令时,将在场景中指定的部分执行三角形的顶点着色器。随后,便使用该部分的输出计算加速结构。

Components
将各组件连接到顶点阵列对象。其与调用glDraw*()的定义类似。不过,并非是立即执行该调用,而是对其进行记录和延期,直至我们在包含这些组件的组件集中发出一个构建命令。

还可以对该组件设置其他属性,以便在光线遍历阶段进行交互:
•正面(顺时针或逆时针方向)
•几何图形是否遮挡光线
•几何图形是否对对某类光线可见
•可见表面(前或后)

生成组件并设置属性的例子如下:

glGenVertexArrays(1, &vertexArray);
// ... upload index data and model space vertex data as usual
glCreateComponentsIMG(1, &componentHandle);
glComponentVertexArrayIMG(componentHandle, vertexArray);
glComponentIndexedGeometryIMG(componentHandle, GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, 0, 0);
glComponentBufferRangeIMG(componentHandle, GL_UNIFORM_BUFFER, 0, transformUBOHandle, 0, transformUBOSize);
glComponentVisibleFaceIMG(componentHandle, GL_FRONT_AND_BACK);
glComponentOccluderIMG(componentHandle, GL_TRUE);

请注意,GPU尚未有待执行的对象。此刻,仅指定组件的数据。同样要注意的是,顶点缓冲区需要保持激活状态,因为组件需要对其进行参照——并非复制。

未完待续,请多内容请关注下方二维码

加入Imagination 中文社区,获取更多最新科技资
Imagination中文技术社区权威发布有关Imagination公司CPU,GPU以及连接IP、无线IP最新资讯,提供有关物联网、可穿戴、通信、汽车电子、医疗电子等应用信息,每日更新大量信息,让你紧跟技术发展,欢迎免费注册。网址:imgtec.eetrend.com


    关注 微文阅读推荐


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册