【问题标题】:Fragment shader output values片段着色器输出值
【发布时间】:2012-02-10 10:42:48
【问题描述】:

我将我的 Alpha 通道用作与混合无关的 8 位整数索引,因此我想仔细控制位值。特别是,我需要一个 FBO 渲染纹理中具有特定 alpha 值的所有像素,以匹配着色器中具有相同 alpha 值的所有像素。经验告诉我在比较浮点值是否相等时要小心……

虽然使用浮点 vec4 设置颜色值可能不会给我带来问题,但我的理解是,即使是半精度 16 位浮点数也能够区分所有 8 位整数 (0-255) 值。但我更愿意在片段着色器中执行整数运算,所以我可以确定这些值。

在片段着色器中执行整数操作是否会影响性能?

输出是如何缩放的?我在某处读到,将整数向量作为片段的颜色输出发送是有效的。但它是如何缩放的?如果我发送一个整数 0-255 的 uvec4,它会适当地缩放吗?我希望它直接将整数值写入像素格式,对于整数格式,我不希望它进行任何缩放。也许对于 RGBA8 发送大于 255 的 int 值会将其钳制为 255,并将负整数钳制为零,依此类推。

这个问题很困难,因为除非我抓取渲染的图像并仔细检查它们,否则我无法通过打印出颜色值来进行调试。如果有些东西不匹配,也许我可以画出鲜艳的颜色。

Here 是我在此主题上找到的相关主题。它比以前更让我困惑。

【问题讨论】:

  • 请注意,这个帖子是从 2004 年开始的。从那时起,在 GPU 领域进行了大量开发。即现在支持整数(图像)缓冲区和按位运算。所以你在使用这些时是清楚的。
  • 啊,我没注意到。谢谢,这肯定是一个非常老的讨论......那我该怎么办?我可以在管道中一直使用整数,还是在设置最终片段颜色之前仍需要转换为浮点数?我只是对将我的 FBO 颜色缓冲区上的 alpha 通道设置为我在颜色属性中使用无符号字节指定的特定整数值特别感兴趣。

标签: opengl shader fragment-shader


【解决方案1】:

我建议不要使用颜色附件的 alpha 通道,而是使用具有显式整数格式的附加渲染目标。这至少从 OpenGL-3.1 开始可用(我看过的最古老的规范,对于这个答案)。请参阅 OpenGL 函数 glBindFragDataLocation,它绑定了片段着色器 out 变量。在您的情况下为int out $VARIABLENAME。对于进入下一个状态的输入,请使用 整数采样器。具体参考OpenGL-3.1和GLSL-1.30的规范。

【讨论】:

  • 你认为这会在 OpenGL 2.0/2.1 硬件上发生灾难性的失败吗? (可以做 3.0+ 的唯一硬件是 Sandy Bridge HD2/3000 和 Nvidia/AMD 的最后 3 代左右)
  • @StevenLu:由于整数运算仅在 OpenGL-3 中引入,我会说你对 OpenGL-2 硬件不走运。
  • 好的。让我们看看它与浮点相等检查的效果如何。
猜你喜欢
  • 1970-01-01
  • 2013-07-30
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多