片段着色器功能中 float4 和 half4 的主要区别是啥?

Posted

技术标签:

【中文标题】片段着色器功能中 float4 和 half4 的主要区别是啥?【英文标题】:What is the main difference between float4 and half4 in fragment shader function?片段着色器功能中 float4 和 half4 的主要区别是什么? 【发布时间】:2018-12-21 09:07:15 【问题描述】:

我尝试设置 MTLPixelFormatRGBA16Float 的渲染管线和 MTKView 颜色附件像素格式。

但是,它似乎与 MTLPixelFormatBGRA8Unorm_sRGB 相同。

我只是想让渲染颜色范围更高(HDR)。

片段函数的返回类型重要吗?

我应该设置什么来实现金属的高动态范围?

【问题讨论】:

您实际上是在生成 [0, 1] 范围之外的颜色值吗?您是否正在应用任何类型的色调映射过程?听起来你已经成功创建了一个 HDR 渲染目标,但是你在做任何 HDR 绘图吗? 是的。我使用 MTLPixelFormatRGBA16Float 和 MTLPixelFormatBGRA8Unorm_sRGB 格式纹理在一个渲染过程中存储 [0,1] 之外的一些颜色值。之后,我使用一些简单的色调映射算法在另一个渲染过程中将其映射到 [0,1] 内。 HDR 是否意味着颜色可以存储在中间渲染通道中的 [0,1] 范围之外并在最后一个渲染通道中映射到 [0,1] 范围内?谢谢你的帮助。 @warrenm 这是其中的一个重要部分,是的。使用更高精度的中间目标可以实现光晕、景深等,这些通常被认为是 HDR“外观”的重要组成部分。 顺便说一句,尽可能使用half4 作为片段函数返回类型,尤其是在移动设备上。 【参考方案1】:

基于此Metal Shading Language Specification

浮点数:

一个 32 位浮点数。浮点数据类型必须符合 IEEE 754单精度存储格式。

float精度通常用于世界空间位置、纹理坐标或涉及复杂函数(例如三角函数或幂/幂)的标量计算。

一半:

16 位浮点数。半数据类型必须符合 IEEE 754 binary16存储格式。

半精度适用于短向量、方向、对象空间位置、高动态范围颜色。

【讨论】:

以上是关于片段着色器功能中 float4 和 half4 的主要区别是啥?的主要内容,如果未能解决你的问题,请参考以下文章

金属着色器混合片段接收错误的颜色值

纹理上的片段着色器

Unity中Shader的三种基本类型

SpriteKit 中的顶点着色器

在顶点和片段着色器中访问同名统一失败

片段着色器是不是处理来自顶点着色器的所有像素?