我试图在我的着色器中实现一种从法线贴图读取法线的方法。然而,我在读取颜色时发现了一个问题,阻止了它。
我认为诸如 (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),这是我没想到的。我希望两种颜色是相同的。我不知道什么?我缺少什么?
但在 x>0 中我得到了颜色 (188, 188, 255),这是我没想到的。
您是否偶然将这些值渲染到交换链图像?
如果是这样,交换链图像几乎总是在 sRGB 色彩空间中。这意味着写入它们的所有浮点都将处于线性色彩空间中,因此将被转换为 sRGB。
如果源图像也在sRGB色彩空间中,则从中读取将反转转换为线性 RGB 色彩空间。但由于这些是逆变换,因此您得到的总体输出将与输入相同。
如果要将纹理中的数据视为数据而不是颜色,则不得使用使用 sRGB 色彩空间的图像格式。交换链图像几乎总是 sRGB,因此您必须使用用户创建的图像来进行此类输出。
而且,128 永远不会精确地产生 0.5。128/255 比 0.5 稍大。