GLSL:gl_FragCoord问题

Alb*_*ore 9 shader opengl-es glsl coordinates

我正在尝试使用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);
}
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.但是,我想做一些基于像素的过滤,例如Median.所以,我想在像素坐标而不是normalized(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));
}
Run Code Online (Sandbox Code Playgroud)

所以,简单的问题是,我应该使用什么来取代vec2(256, 256)我可以获得相同的结果,就像我使用uv coords一样.

谢谢!

Mat*_*gro 19

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

  • @Albus Nope,正如我所说,唯一的方法是通过统一变量手动传递它. (2认同)
  • @Albus阅读http://www.lighthouse3d.com/opengl/glsl/index.php?ogluniform (2认同)