【问题标题】:How to get pixel information inside a fragment shader?如何在片段着色器中获取像素信息?
【发布时间】:2012-03-19 23:25:37
【问题描述】:

在我的片段着色器中,我可以加载纹理,然后执行以下操作:

uniform sampler2D tex;

void main(void) {
   vec4 color = texture2D(tex, gl_TexCoord[0].st);
   gl_FragColor = color;
}

将当前像素设置为纹理的颜色值。我可以修改这些,等等,效果很好。

但有几个问题。我如何分辨我是“哪个”像素?例如,假设我想将像素 100,100 (x,y) 设置为红色。其他都变黑了。我该怎么做:

"如果 currentSelf.Position() == (100,100);那么颜色=红色;否则颜色=黑色?

?

我知道如何设置颜色,但如何获得“我的”位置?

其次,如何从相邻像素中获取值?

我试过了:

vec4 nextColor = texture2D(tex, gl_TexCoord[1].st);

但不清楚它返回的是什么?如果我是 100,100 像素;如何从 101,100 或 100,101 中获取值?

【问题讨论】:

    标签: opengl glsl


    【解决方案1】:

    如何分辨我是“哪个”像素?

    你不是像素。你是一个片段。 OpenGL 称它们为“片段着色器”是有原因的。这是因为它们还不是像素。事实上,它们不仅可能永远不会变成像素(通过discard 或深度测试或其他方式),多亏了多重采样,多个片段可以组合形成一个单个像素。

    如果您想知道片段着色器在窗口空间中的位置,请使用gl_FragCoord。片段位置是浮点值,而不是整数,因此您必须使用范围而不是单个“100, 100”值进行测试。

    其次,如何从相邻像素中获取值?

    如果您在谈论相邻的帧缓冲区像素,您不要。片段着色器不能任意从帧缓冲区中读取,无论是在自己的位置还是在相邻的位置。

    如果您正在谈论从您访问的那个访问相邻的 texel,那么这只是将您传递给texture2D 的纹理坐标偏置的问题。您必须获取纹理的大小(因为您没有使用 GLSL 1.30 或更高版本,您必须手动传入),反转大小并从纹理坐标的 S 和 T 分量中添加或减去这些大小.

    【讨论】:

    • 打败我;我不得不说的与此稍有不同的是链接opengl.org/sdk/docs/manglsl/xhtml/gl_FragCoord.xml 更详细地介绍了gl_FragCoord 以及如果他真的想基于多个组合来计算输出片段,则建议使用中间渲染到纹理输出缓冲区中的相邻像素。
    • 基本上我想要做的是,如果像素 x,y 的邻居中有红色,则增加 x,y 中的红色。有没有教程可以解释如何做到这一点?
    • @user697111:您想在纹理的红色通道上实现“膨胀”过滤器。谷歌这些关键词,你应该会找到很多。
    • @XStylish:不,不是。我没有看到any notice in this section that gl_FragCoord is compatibility-only。所有兼容性内容都在第 7.1.7 节中,而 gl_FragCoord 在 7.1.5 中。
    • @NicolBolas 太好了!我没有查看官方的 Khronos 页面,但我之前在那里看到的一些论坛帖子令人困惑,听起来它已被弃用,所以顺便说一句,感谢您的澄清
    【解决方案2】:

    简单易懂。

    只需根据分辨率计算像素的大小。然后查找 +1 和 -1。

    vec2 onePixel = vec2(1.0, 1.0) / u_textureSize;
    gl_FragColor = (
       texture2D(u_image, v_texCoord) +
       texture2D(u_image, v_texCoord + vec2(onePixel.x, 0.0)) +
       texture2D(u_image, v_texCoord + vec2(-onePixel.x, 0.0))) / 3.0;
    

    有一个很好的例子here

    【讨论】:

      猜你喜欢
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      相关资源
      最近更新 更多