在我的片段着色器中,我可以加载纹理,然后执行此操作:
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的值?
答案 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