Opengl 某些GPU或驱动程序是否缺少一些glsl内置功能?

Opengl 某些GPU或驱动程序是否缺少一些glsl内置功能?,opengl,glsl,gpu,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_值是从纹理查找中导出的。现在,我可以设置纹理,使frag_value的日志应该给出合理的答案(即,给出frag_颜色0.0->1.0是合理的范围)

我试图在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_值是从纹理查找中导出的。现在,我可以设置纹理,使
frag_value
的日志应该给出合理的答案(即,给出frag_颜色0.0->1.0是合理的范围),但它始终渲染为黑色(因此我假设它只是将其设置为零)。当然,我可以通过删除日志(并将frag_值纹理设置在0.0->1.0范围内)来验证我是否合理地设置了
frag_值
,这符合我的预期,乘法和其他简单操作也可以正常工作


我的问题是,这是预期的行为吗?我错过什么了吗?是否有些GPU或驱动程序缺少某些内置功能(例如sqrt似乎也不起作用)?

我非常确定常规非浮动纹理的颜色组件在0.0-1.0范围内

我还非常确定默认情况下,
gl_FragColor
组件被钳制在0.0-1.0范围内


0我非常确定常规非浮动纹理的颜色分量在0.0-1.0范围内

我还非常确定默认情况下,
gl_FragColor
组件被钳制在0.0-1.0范围内

0 某些GPU或驱动程序是否缺少一些glsl内置功能

对。噪声功能在任何地方都没有正确实现-NVidia上不起作用,性能大幅下降或ATI上不起作用(上次我检查时是这样的)

某些GPU或驱动程序是否缺少一些glsl内置功能

对。噪声功能在任何地方都没有正确实现-NVidia上不起作用,性能大幅下降或ATI上不起作用(上次我检查时是这样的)

解决了它:

纹理上载通常限制在0.0->1.0的范围内(不管从内部格式类型名称可以推断出什么),因此当然
log
不会提供任何有用的内容。使用引入了全范围浮动,它扩展了内部类型,以包括全范围浮动,例如亮度α32FαARB。使用它可以解决问题。

解决了它:


纹理上载通常限制在0.0->1.0的范围内(不管从内部格式类型名称可以推断出什么),因此当然
log
不会提供任何有用的内容。使用引入了全范围浮动,它扩展了内部类型,以包括全范围浮动,例如亮度α32FαARB。使用它可以解决问题。

如果我错了,请告诉我,但是OpenGL不应该模拟硬件中缺少的东西吗?我的意思是,图形卡的驱动程序应该能够处理这个问题,即使硬件没有实现它。是吗?@Shahbaz-是的,它应该回到软件渲染上来。所以听起来要么我做错了什么,要么什么工作不正常。如果我做错了,告诉我,但OpenGL不应该模拟硬件中缺少的东西吗?我的意思是,图形卡的驱动程序应该能够处理这个问题,即使硬件没有实现它。是吗?@Shahbaz-是的,它应该回到软件渲染上来。所以听起来要么我做错了什么,要么什么工作不正常。对不起,我刚刚澄清了这一点。我确实将frag_值设置为一个数字,该数字生成的日志范围为0->1(然后在直接渲染时将其设置为其他值)。除非它为我夹紧纹理值!我已经要求它在内部将其存储为浮点,但我不太相信它没有做邪恶的事情。我可以确认纹理值似乎不是全范围浮点(钳制0->1)。我会进一步调查这是否是我的问题。对不起,我刚刚澄清了这一点。我确实将frag_值设置为一个数字,该数字生成的日志范围为0->1(然后在直接渲染时将其设置为其他值)。除非它为我夹紧纹理值!我已经要求它在内部将其存储为浮点,但我不太相信它没有做邪恶的事情。我可以确认纹理值似乎不是全范围浮点(钳制0->1)。我将进一步调查这是否是我的问题。