如何在片段着色器中获取像素信息?

use*_*111 26 opengl glsl

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

uniform sampler2D tex;

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

这将当前像素设置为纹理的颜色值.我可以修改这些等,它运作良好.

但是有几个问题.我如何判断"我"是哪个像素?例如,假设我想将像素100,100(x,y)设置为红色.其他一切都变黑了.我该怎么做:

"if currentSelf.Position()==(100,100); then color = red; else color = black?"

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

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

我试过这个:

vec4 nextColor = texture2D(tex, gl_TexCoord[1].st);
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*las 32

我如何判断"我"是哪个像素?

你不是一个像素.你是一个片段.OpenGL称它们为"片段着色器"是有原因的; 这是因为他们不是像素还没有.实际上,discard由于多重采样,不仅可能它们永远不会成为像素(通过或深度测试或其他),多个片段可以组合形成单个像素.

如果要在窗口空间中分辨片段着色器的位置,请使用gl_FragCoord.片段位置是浮点值,而不是整数,因此您必须使用范围而不是单个"100,100"值进行测试.

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

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

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

  • @ user697111:您想要在纹理的红色通道上实现"扩张"过滤器.谷歌那些关键词,你应该找到很多. (2认同)

new*_*rts 5

十分简单。

只需根据分辨率计算像素的大小。然后查找 +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;
Run Code Online (Sandbox Code Playgroud)

有一个很好的例子在这里