某些GPU或驱动程序是否缺少某些glsl内置函数?

时间:2012-03-23 23:12:53

标签: opengl glsl gpu

我正在尝试在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似乎也无法工作)?

3 个答案:

答案 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。使用它可以解决问题。