范围 [0, 255] 中的颜色与范围 [0, 1] 中的颜色不对应

Ans*_* PP 1 glsl vulkan

我试图在我的着色器中实现一种从法线贴图读取法线的方法。然而,我在读取颜色时发现了一个问题,阻止了它。

我认为诸如 (0, 0, 255)(蓝色)这样的一种颜色相当于着色器中的 (0, 0, 1)。然而,最近我发现,例如,如果我传递颜色为 (128, 128, 255) 的纹理,它并不等于着色器中的 ~(0.5, 0.5, 1)。

在片段着色器中,我编写以下代码:

    vec3 col = texture(texSampler[0], vec2(1, 1)).rgb;   // texture with color (128, 128, 255)
    
    if(inFragPos.x > 0)
        outColor = vec4(0.5, 0.5, 1, 1);    // I get (188, 188, 255)
    else
        outColor = vec4(col, 1);            // I get (128, 128, 255)
Run Code Online (Sandbox Code Playgroud)

在 x<0 中,我得到颜色 (128, 128, 255),这是预期的。但在 x>0 中我得到了颜色 (188, 188, 255),这是我没想到的。我希望两种颜色是相同的。我不知道什么?我缺少什么?

Nic*_*las 5

但在 x>0 中我得到了颜色 (188, 188, 255),这是我没想到的。

您是否偶然将这些值渲染到交换链图像?

如果是这样,交换链图像几乎总是在 sRGB 色彩空间中。这意味着写入它们的所有浮点都将处于线性色彩空间中,因此将被转换为 sRGB。

如果源图像也在sRGB色彩空间中,则从中读取将反转转换为线性 RGB 色彩空间。但由于这些是逆变换,因此您得到的总体输出将与输入相同。

如果要将纹理中的数据视为数据而不是颜色,则不得使用使用 sRGB 色彩空间的图像格式。交换链图像几乎总是 sRGB,因此您必须使用用户创建的图像来进行此类输出。

而且,128 永远不会精确地产生 0.5。128/255 比 0.5 稍大。