Use 16-bit precision in shaders
Use 16-bit precision in GPU calculations, so shaders use less memory, bandwidth, and power, and calculations are faster.
阅读时间2 分钟最后更新于 1 个月前
By default, GPUs use 32-bit precision. You can use 16-bit precision instead in GPU calculations, which has the following benefits on mobile platforms:
- Shaders use less memory, bandwidth, and power.
- Calculations are faster. Using fewer bits can improve how the GPU allocates registers.
Create a 16-bit variable
To use 16-bit precision in a shader, use when you declare a scalar, a vector, or a matrix. For example:
halfhalf _Glossiness;half4 _Color;half4x4 _Matrix;
To use 16-bit precision in a texture sampler, add when you declare it. For example:
half4Texture2D<half4> _MainTex;
16-bit precision might not be enough for some shader calculations. This might cause visible errors such as color banding or stuttering geometry. To check for errors, run your project on a platform that supports . If there are errors, use instead.
halffloatA variable is stored in buffers with a size and alignment of 32 bits.
halfUse 16-bit values on more platforms
By default, has no effect on higher performance platforms in Unity, for example platforms that use MacOS. A variable becomes a , and the GPU uses 32-bit values for calculations.
halfhalffloatTo use 16-bit precision on more platforms, go to Edit > > Player and set Shader Precision Model to Uniform. Unity then treats in your HLSL code as the following:
Project Settings
?
half- for scalars
min16float - for texture samplers
float
When Unity compiles shaders, becomes a platform data type that allows the GPU to use 16-bit precision for calculations if it supports them. For example:
min16float- If you use DirectX 11 or 12, the variable remains a .
min16float - If you use OpenGL, the variable becomes .
mediump - If you use Vulkan, the variable becomes a float.
RelaxedPrecision - If you use Metal, the variable becomes a , but the GPU uses 16-bit values for calculations.
float
To override the Shader Precision Model setting for textures, add when you declare a texture sampler. For example .
_halfTexture2D<half4> _MainTexAdditional resources
- Data Types (HLSL) in the Microsoft HLSL documentation
- Optimize shaders