基本数据类型
高精度: float
高精度浮点值;一般是32位(就像是普通编程语言中的浮点数)
完全浮点精度通常用于世界空间位置,文理坐标或者涉及复杂函数(如三角学或幂/指数)的标量计算
中精度:half
中精度浮点值;一般为16位(范围为-60000到+60000,精度为3位小数)
half精度是有用的对于短矢量,方向,物体空间位置,高动态范的颜色
低精度:fixed
低精度fixed值,一般为11位,位置为-2.0到+2.0,精度为1/256.
fixed精度是有用的对于常规颜色(通常储存在常规文理)和执行简单的操作.
整数数据类型
整数(int数据类型)通常用作循环计数器或数组索引.为此,他们通常可以在各种平台上很好的工作.
根据平台的不同,GPU可能不支持整数类型.例如Direct3D 9和OpenGL ES 2.0 gpu只对浮点数据进行操作,而看起来很简单的整数表达式(设计位或逻辑操作)可能会使用相当复杂的浮点数书序指令进行模拟.
Direct3D 11、OpenGL ES 3、Metal和其他现代平台都对整数数据类型提供了适当的支持,因此使用唯一和位掩蔽可以正常工作.
Texture/Sampler types
通常你在你的HLSL代码中声明纹理如下:
sampler2D _MainTex;
samplerCUBE _Cubemap;
对于一动平台,这些转换为"低精度采样器",即纹理中期望有低精度的数据.如果你知道你的纹理包含HDR颜色,你可能想要使用半精度采样器:
sampler2D_half _MainTex;
samplerCUBE_half _Cubemap;
或者如果你的纹理包含完整的float精度数据(;如深度纹理),使用一个完整的精度采样器:
sampler2D_float _MainTex;
samplerCUBE_float _Cubemap;
精度,硬件支持和性能
float/half/fixed数据类型使用的一个复杂之处是PC GPU的精度总是很高.也就是说,对弈所有的PC(Window/Mac/Linux)GPU,在着色器中写入float,half或者fixed类型并不重要.他们总是以32位浮点精度计算所有的东西.
half和fixed类型只在针对一动GPU时才变的相关,在移动GPU中,这些类型主要是为了电源(有时是性能)约束而存在的.记住,你需要在手机上测试你的着色器,看看你是否遇到精度/数值问题.
及时在移动GPU上,不同的GPU家族也有不同的精度支持.治理是一个概述,每个移动GPU家族如何对待每个浮点类型(由他们使用的bit数表示)
大多数现在的移动GPU实际上只支持32位数字(用于浮点类型)或16位数字(用于half和fixed类型).一些旧的GPU有不同的顶点着色精度和片段着色器计算.
使用低精度通常可以更快,要么是由于改进的GPU寄存器的分配,要么是由于某些低精度数学操作的特殊"快捷路径"执行单元.即使在没有原始性能优势的情况下,使用较低的精度通常也会减少GPU的功耗,从而提高电池的寿命.
一般的经验法则是,除了位置和纹理坐标之外,所有的开始都要有half的精度.只有当half的精度不足以满足某些部分的计算时,才能提高精度.
支持无穷大,NANs和其他特殊的浮点值.
支持特殊的浮点值取决于哪个(主要是移动)GPU家族你正在运行.
所有支持Direct3D 10的PC gpu都支持非常详细的IEEE 754浮点标准。这意味着浮点数在CPU上的行为与常规编程语言中的行为完全相同。
移动gpu可以有稍微不同的支持级别。在一些情况下,用0除0可能会得到NaN(不是数字);在其他情况下,它可能导致无穷大、零或任何其他未指定的值。确保在目标设备上测试着色器,以检查它们是否受支持。

本文详细介绍了Shader中基本数据类型,包括高精度、中精度和低精度浮点数,以及整数类型。讨论了Texture/Sampler类型的声明,并强调在不同平台上的硬件支持和性能差异。特别指出在移动GPU上,精度选择对性能和电池寿命的影响,建议初始使用half精度,仅在必要时提升。最后提醒开发者,特殊浮点值的行为在不同GPU上可能有所差异,需在目标设备上进行测试验证。
186

被折叠的 条评论
为什么被折叠?



