着色器数据类型和精度
在Unity的标准语言HLSL着色器,和一般的用数据类型的支持。然而,Unity有一些增加的HLSL的类型,特别是在移动平台上更好的支持。
基本数据类型
在大多数计算着色器对浮点数进行(这将在常规编程语言如C #浮动)。浮点类型的几种变体:浮、半固定(以及向量/矩阵的变体,如half3和float4x4)。这些类型的精度不同(因此,性能或功耗使用):
高精度: float
最高精度浮点值;一般为32位(就像普通编程语言的浮点)。
全浮点精度一般用于世界空间位置,纹理坐标,或标量的计算涉及复杂的功能如三角或功率/指数。
中等精度: half
中等精度浮点值;一般为16位(范围为60000至60000,精度约为十进制数字的3)。
半精度适用于短矢量、方向、物体空间位置、高动态范围颜色。
低精度: fixed
最低精度不动点值。一般11位,范围为- 2至2和1 /精度。
固定的精度是有用的常规颜色(通常存储在常规纹理),并执行简单的操作。
整数数据类型
整型(int数据类型)经常被用来作为循环计数器或数组索引。为了这个目的,他们通常工作在各种平台。
根据不同的平台,整数类型可能不支持的GPU。例如,Direct3D 9和OpenGL ES 2 GPU只在浮点数据,而看似简单的整数表达式(包括点或逻辑运算)可以进行相当复杂的浮点运算指令。
Direct3D 11, OpenGL ES 3, Metal and other modern platforms have proper support for integer data types, so using bit shifts and bit masking works as expected.
混合成的 vector/matrix 类型
HLSL内置矢量和矩阵是从基本类型创建类型。例如,是一个三维向量float3。X、Y、Z分量,和half4是中等精度4D向量X,Y,Z,W组件。或者,向量可以使用R,G,B,一个颜色组件。
矩阵类型是建立在类似的方式;例如float4x4是4x4变换矩阵。请注意,有些平台只支持方阵,最明显的是OpenGL ES 2。
精度、硬件支持和性能
一个复杂的浮动/一半/固定数据类型使用的是PC GPU总是高精度。这是所有PC(Windows / Mac / Linux)的GPU,不管你写的浮物,在你的着色器或半固定数据类型。他们总是计算所有的32位浮点精度。
半固定类型只能成为有关针对移动GPU,这些类型主要存在功率(有时表现)约束。记住,你需要测试你的着色器的手机看你是否正在运行精度的数值问题。
即使在移动GPU,支持不同精度不同GPU的家庭。这里的每个家庭将每个移动GPU浮点类型的概述(由使用它的比特数表示):
GPU Family | float | half | fixed |
---|---|---|---|
PowerVR Series 6/7 | 32 | 16 | |
PowerVR SGX 5xx | 32 | 16 | 11 |
Qualcomm Adreno 4xx/3xx | 32 | 16 | |
Qualcomm Adreno 2xx | 32 vertex 24 fragment | ||
ARM Mali T6xx/7xx | 32 | 16 | |
ARM Mali 400/450 | 32 vertex 16 fragment | ||
NVIDIA X1 | 32 | 16 | |
NVIDIA K1 | 32 | ||
NVIDIA Tegra 3/4 | 32 | 16 |
最现代的移动GPU实际上只支持32位数字(用于浮点型)或16位数字(用于半固定型)。一些老年人有不同的精度为顶点着色器和片段着色器计算。
使用低精度通常可以更快,由于改进的GPU登记分配,或因特殊的“快速通道”的执行单位,某些低精度的数学运算。即使没有原料的性能优势,采用较低的精度通常使用较少的电力在GPU上,导致更好的电池寿命。
一般的经验法则是,除了位置和纹理坐标以外,一切都以半精度开始.。只有提高精度,如果半精度是不够的一些部分的计算。
支持无穷,而且和其他特殊的浮点值
特殊的浮点值的支持可以不同,取决于(主要是手机)你运行的GPU的家庭。
所有的PC GPU支持Direct3D 10支持很好指定的IEEE 754浮点标准。这意味着浮点数的行为与CPU上的常规编程语言完全一样。
移动GPU可以稍有不同程度的支持。在某些情况下,零除以零可能会导致一个NaN(“不是一个数字”),对其他人可能会导致无穷大,零或任何其他未指定的值。确保测试你的着色器目标设备上检查他们的支持。