在我的片段着色器中,我可以加载纹理,然后执行以下操作:
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组件中添加或减去这些大小.
十分简单。
只需根据分辨率计算像素的大小。然后查找 +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)
有一个很好的例子在这里