GLSL:gl_FragCoord问题

时间:2011-02-28 16:39:42

标签: opengl-es coordinates glsl shader

我正在尝试使用GLSL for OpenGL ES 2.0。我有四边形和我正在渲染的纹理。我可以成功地这样做:

//VERTEX SHADER
attribute highp vec4 vertex;
attribute mediump vec2 coord0;

uniform mediump mat4 worldViewProjection;

varying mediump vec2 tc0;

void main()
{
    // Transforming The Vertex
    gl_Position = worldViewProjection * vertex;

    // Passing The Texture Coordinate Of Texture Unit 0 To The Fragment Shader
    tc0 = vec2(coord0);
}

//FRAGMENT SHADER
varying mediump vec2 tc0;

uniform sampler2D my_color_texture;

void main()
{
    gl_FragColor = texture2D(my_color_texture, tc0);
}

到目前为止一切顺利。但是,我想做一些基于像素的过滤,例如中位数。所以,我想在像素坐标而不是标准化(tc0)中工作,然后将结果转换回规范化的坐标。因此,我想使用gl_FragCoord而不是uv属性(tc0)。但是我不知道怎么回到标准化的坐标,因为我不知道gl_FragCoords的范围。知道我怎么能得到它吗?我已经做到了这一点,使用固定值进行“标准化”,虽然它不能完美地工作,因为它会导致拉伸和平铺(但至少会显示某些内容):

//FRAGMENT SHADER
varying mediump vec2 tc0;

uniform sampler2D my_color_texture;

void main()
{
    gl_FragColor = texture2D(my_color_texture, vec2(gl_FragCoord) / vec2(256, 256));
}

所以,简单的问题是,我应该在vec2(256, 256)的位置使用什么,这样我才能得到与使用uv coords相同的结果。

谢谢!

2 个答案:

答案 0 :(得分:18)

gl_FragCoord在屏幕坐标中,因此要获得标准化坐标,您需要除以视口宽度和高度。您可以使用统一变量将该信息传递给着色器,因为它没有内置变量。

答案 1 :(得分:3)

如果符合以下情况,您还可以通过非标准化坐标对纹理进行采样:

  • 从GL_TEXTURE_RECTANGLE
  • 按纹理()采样
  • 从常规纹理或纹理缓冲区中通过texelFetch()进行采样