How to get pixel information inside a fragment shader?

前端 未结 2 977
误落风尘
误落风尘 2021-02-01 16:26

In my fragment shader I can load a texture, then do this:

uniform sampler2D tex;

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


        
相关标签:
2条回答
  • 2021-02-01 17:25

    Easy peasy.

    Just compute the size of a pixel based on resolution. Then look up +1 and -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;
    

    There's a good example here

    0 讨论(0)
  • 2021-02-01 17:29

    How do I tell "which" pixel I am?

    You're not a pixel. You're a fragment. There's a reason that OpenGL calls them "Fragment shaders"; it's because they aren't pixels yet. Indeed, not only may they never become pixels (via discard or depth tests or whatever), thanks to multisampling, multiple fragments can combine to form a single pixel.

    If you want to tell where your fragment shader is in window-space, use gl_FragCoord. Fragment positions are floating-point values, not integers, so you have to test with a range instead of a single "100, 100" value.

    Secondly, how do I get values from a neighbor pixel?

    If you're talking about the neighboring framebuffer pixel, you don't. Fragment shaders cannot arbitrarily read from the framebuffer, either in their own position or in a neighboring one.

    If you're talking about accessing a neighboring texel from the one you accessed, then that's just a matter of biasing the texture coordinate you pass to texture2D. You have to get the size of the texture (since you're not using GLSL 1.30 or above, you have to manually pass this in), invert the size and either add or subtract these sizes from the S and T component of the texture coordinate.

    0 讨论(0)
提交回复
热议问题