我正在尝试使用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相同的结果。
谢谢!
答案 0 :(得分:18)
gl_FragCoord在屏幕坐标中,因此要获得标准化坐标,您需要除以视口宽度和高度。您可以使用统一变量将该信息传递给着色器,因为它没有内置变量。
答案 1 :(得分:3)
如果符合以下情况,您还可以通过非标准化坐标对纹理进行采样: