在移动设备上使用着色器渲染逼真的图像
发表于 2021-08-12 11:06:18

在本帖中提及的Qualcomm产品均由Qualcomm Technologies公司其子公司提供。

游戏中的真实感是通过实施照明和阴影、物理性粒子系统、和水分效应,以及运动模糊凹凸贴图、和失真等特殊效果来实现的。通过在当今的 GPU 硬件上完善这些,可以使您的游戏达到如此逼真的效果,以至于玩家们不得不仔细看看,以确定他们看到的是计算机图像还是真实的东西。很简单,这些图像看起来就像是屏幕上的魔法!

利用着色器可以实现所有这些效果。这些运行在图形处理器上的小程序为开发人员提供了一种可编程的渲染管道,能够在运行过程中实现动态渲染效果。

着色器101

编写着色器程序需要使用高级着色语言。常见的例子包括OpenGL着色语言(GLSL)DirectX高级着色语言(HLSL),这两种着色语言均将硬件抽象上升为高级二维和三维渲染构造。一旦予以实施,通常会将着色器编译为低级着色语言,例如ARB汇编语言DirectX着色器汇编语言,以便在给定的平台上进行优化和执行。

1988年,作为RenderMan接口规范的组成部分,皮克斯动画首次推出了着色器,并迅速淘汰了具有固定功能的各种渲染管道。从那时起,图形处理器不断发展,包含了各种硬件加速可编程着色处理功能,以支持越来越多的着色类型,包括:

  • 像素着色器(又名片段着色器):计算每个像素的颜色,以根据开发人员试图实现的特定效果(例如:照明,凹凸贴图等)进行渲染。
  • 顶点着色器:将每个顶点从三维空间转换到视锥体空间,以实现光栅化,并最终用于屏幕上的投影。
  • 几何着色器:生成新的图元(例如:三角形)。可以将其用于各种程序性效果,例如程序植被,表面损坏,粒子效果等。
  • 细分曲面着色器:将网格细分为粒度更细的网格。可以将其用于细节等级的动态调整。

着色器构成了目前动态/可编程渲染管道的基础;通常情况下,各个着色器会被链接在一起,这样一个着色器的输出就会成为另一个着色器的输入。然后各个管道可以确保在屏幕上进行最终渲染之前进行多种效果/类型的处理。

随着时间的推移,着色器的种类及其相关指令集不断扩大,图形处理器支持的着色器数量也在增加。像素着色器和顶点着色器属于最常用的着色器,而随着统一着色器型号模型的推出,可以确保任何着色器均可以处理这两种类型的数据。通过统一不同着色器的功能和指令集,图形处理器目前可以在某些着色器处于空闲状态时均衡着色器任务。

通常情况下,着色器看起来像是标准的C程序。例如,着色器通常具有用于存储向量或坐标等数据的数据结构、由图形处理器调用的函数、以及用于特定于平台的资源(例如:目标算术逻辑单元(ALU))的构造。以下是在OpenGL ES中实施的像素着色器小例子,取自QDN使用图形处理器燃烧火焰的示例项目

#version 300 es
in vec2 TexCoords;
in vec4 ParticleColor;
out vec4 color;
uniform sampler2D sprite;
void main()
{
 #if 1
  color = (texture(sprite, TexCoords) * ParticleColor);
 #else
  color = ParticleColor;
 #endif
}

这是关于着色器的 hello world实例,因为它展示了几种设置像素颜色的单行代码。在第一种情况下,着色器将某一像素从一个特定的纹理坐标开始拖动,并基于某些粒子颜色修改数值,从而设置像素的颜色。在第二种情况下,着色器只是将粒子的颜色分配至像素颜色。

Adreno上的着色器

着色器仍在持续发展,并在如今的尖端移动图形处理器中发挥关键作用,包括在本公司的Snapdragon® 移动平台上提供的Qualcomm® Adreno™图形处理器

从Adreno 2xx系列开始,本公司利用包含像素着色器和顶点着色器的统一着色器架构将着色器支持纳入到Adreno中。以四个为一组,将顶点和像素作为向量进行处理,Adreno可以在其算术逻辑单元范围内平衡像素着色器和顶点着色器的负荷,如附图1所示。

附图1  显示Adreno统一着色器架构如何在其算术逻辑单元范围内平衡顶点着色器和像素着色器的概念图

从Adreno 3xx开始,顶点着色器、像素着色器、和通用图形处理器处理同样也可以共享相同的算术逻辑单元并获取资源。例如,顶点着色器可以直接访问图形处理器纹理缓存,从而能够以相对简单的方式实现顶点纹理算法(例如:位移映射)。

Adreno 3xx采用多线程架构,这意味着,如果某一个着色器停滞(例如:由于纹理获取),则可以将执行传递到另一个着色器。Adreno 3xx同样支持标量,这意味着使用16位浮点值运行在Adreno上的像素着色器可以提供两倍的功能和性能提升,相比其他基于向量架构的移动图形处理器。最棒的部分是,这是由Adreno图形处理器自动处理,确保开发人员可以自由地专注于编写着色器逻辑。

本公司最新版本的Snapdragon,包括Snapdragon 888 5G移动平台Snapdragon 865 5G移动平台,支持可变速率着色(VRS)。利用可变速率着色,开发人员能够控制像素着色器执行的粒度,以便一次为一个或多个像素着色。利用可变速率着色,程序员可以根据场景的细节级别控制给定区域的着色像素数量,从而有助于降低处理能力和功耗。

Adreno图形处理器支持OpenGL ESVulkanDirectX,为Snapdragon开发游戏和图像应用程序的移动设备开发人员开发者有丰富的软件开发工具包可供选择。此外,许多手机游戏开发者也使用UnityUnreal Engine等第三方游戏引擎。这两种引擎通过对着色语言进行额外的抽象处理,为开发人员提供了在其生态系统中创建着色器的机制,这有助于移植到各种平台。

准备好接受更加现实的景象了吗?

有兴趣了解更多内容的开发人员应该下载Adreno软件开发工具包,以获得各种常见着色器和着色技术的演示和样本,并访问游戏开发人员指南,以获得更多关于在Snapdragon平台上创建最佳体验的深度推荐和指导。如要获得有关特定着色器的更多信息,请访问以下部分:

  • 着色器支持
  • 着色器最佳实践

请务必查看软件开发工具包的/Developer/Assets/Samples/Shaders目录,其中包括许多用OpenGL着色语言和DirectX高级着色语言编写的着色器。同样,在QDN使用图形处理器燃烧火焰的示例项目,包含一个顶点和像素着色器。

SnapdragonQualcomm Adreno是Qualcomm Technologies, Inc.及其子公司的产品。

CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
微博关注
【免责声明:CSDN本栏目发布信息,目的在于传播更多信息,丰富网络文化,稿件仅代表作者个人观点,与CSDN无关。其原创性以及文中陈述文字和文字内容未经本网证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本网不做任何保证或者承诺,请读者仅作参考,并请自行核实相关内容。您若对该稿件有任何怀疑或质疑,请立即与CSDN联系,我们将迅速给您回应并做处理。】