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

时间:2012-03-19 23:25:37

标签: opengl glsl

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

uniform sampler2D tex;

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

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

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

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

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

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

我试过了:

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

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

2 个答案:

答案 0 :(得分:29)

  

如何辨别我是哪个像素?

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

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

  

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

如果您正在谈论相邻的帧缓冲像素,那么。碎片着色器无法在帧缓冲区中任意读取,无论是在自己的位置还是在相邻的位置。

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

答案 1 :(得分: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