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

Opengl 如何在片段着色器中获取像素信息?,opengl,glsl,Opengl,Glsl,在片段着色器中,我可以加载纹理,然后执行以下操作: uniform sampler2D tex; void main(void) { vec4 color = texture2D(tex, gl_TexCoord[0].st); gl_FragColor = color; } 将当前像素设置为纹理的颜色值。我可以修改这些,等等,它工作得很好 但是有几个问题。我如何分辨我是哪个像素?例如,假设我想将像素100100(x,y)设置为红色。其他一切都是黑色的。我如何做一个: “如果cu

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

uniform sampler2D tex;

void main(void) {
   vec4 color = texture2D(tex, gl_TexCoord[0].st);
   gl_FragColor = color;
}
将当前像素设置为纹理的颜色值。我可以修改这些,等等,它工作得很好

但是有几个问题。我如何分辨我是哪个像素?例如,假设我想将像素100100(x,y)设置为红色。其他一切都是黑色的。我如何做一个:

“如果currentSelf.Position()==(100100);那么颜色=红色;否则颜色=黑色?”

?

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

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

我试过这个:

vec4 nextColor = texture2D(tex, gl_TexCoord[1].st);
但不清楚它在返回什么?如果我是像素100100;如何从101100或100101中获取值

我如何分辨我是哪个像素

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

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

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

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

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

Easy peasy

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

有一个很好的例子

快告诉我吧;我要说的是,与此稍有不同的是,链接更详细地介绍了
gl_FragCoord
,如果他真的想根据输出缓冲区中多个相邻像素的组合来计算输出片段,建议使用中间渲染到纹理我想做的是,如果像素x,y有红色的邻居,增加x,y中的红色。有没有一个教程可以解释如何做到这一点?@user697111:你想在纹理的红色通道上实现一个“膨胀”过滤器。用谷歌搜索那些关键词,你会发现很多。@XStylish:不,不是。我不明白。所有的兼容性内容都在第7.1.7节,而
gl\u FragCoord
在第7.1.5节。@nicolabolas太棒了!我没有查看官方的Khronos页面,但我之前在那里看到的一些论坛帖子令人困惑,因为它听起来像是不推荐的,所以顺便说一句,感谢您的澄清