我正在尝试在Linux下使用Intel X3100进行渲染时使用默认的Ubuntu驱动程序执行日志。代码如下所示:
vec4 frag_color;
frag_color.rgb = log(frag_value.rgb);
frag_color.a = frag_value.a
gl_FragColor = frag_color;
其中frag_value是从纹理查找派生的。现在,我可以设置纹理,使得frag_value
的日志应该给出一个合理的答案(即,它在一个合理的范围内给出一个frag_color 0.0-> 1.0),但它总是呈现为黑色(所以我假设它只是将其设置为零)。当然,我可以通过删除日志(并将frag_value纹理设置在0.0-> 1.0范围内)来验证我明智地设置frag_value
,这符合我的预期,以及乘法和其他琐碎的操作工作得很好。
我的问题是,这是预期的行为吗?我错过了什么吗?某些GPU或驱动程序是否缺少某些内置函数(例如sqrt似乎也无法工作)?
答案 0 :(得分:2)
我非常确定常规非浮动纹理的颜色分量在0.0-1.0范围内。
我也很确定默认情况下gl_FragColor
组件被限制在0.0-1.0范围内。
log(x)为0< x< 1是否定的。
答案 1 :(得分:2)
某些GPU或驱动程序是否缺少部分 glsl内置函数?
是。噪声功能在任何地方都没有正确实现 - 在NVidia上无法正常工作,性能下降或ATI无法正常工作(我上次检查时是这种方式)。
答案 2 :(得分:1)
解决了它:
纹理上传通常被限制在0.0-> 1.0的范围内(尽管可能从内部格式类型名称推断出来),所以当然log
不会给出任何有用的东西。使用ARB_texture_float引入了全范围浮点数,它扩展了内部类型以包括全范围浮点数,例如LUMINANCE_ALPHA32F_ARB。使用它可以解决问题。