如何在 WebGL 中的 clip-space 坐标中找到当前输出像素位置?
How to find current output pixel position in clip-space coordinates in WebGL?
所以,在我的顶点着色器中,我正在做这样的事情:
void main() {
gl_Position = vec4((u_matrix * vec3(a_position, 1)).xy, 0, 1);
}
但现在我在片段着色器中,我想访问该位置。也就是说,我正在寻找一个变量来访问正在绘制的像素的当前位置,但在 clip-space 坐标中。这样做的原因是我希望将该像素与纹理中同一位置的像素混合。
看起来 gl_FragCoord
与我想要的 相似,但它在 window-space 中。我想我可以这样转换它:
vec2 what_i_want = vec2(gl_FragCoord.x / 1920., gl_FragCoord.y / 1080.);
但是我需要知道我的 canvas 尺码。我 可以 传入 canvas 尺寸作为制服,但这似乎有点多。有没有办法在片段着色器中以某种方式访问这个值?
你走在正确的轨道上。您必须在统一变量中设置视口的大小 (canvas)。没有其他选择。这就是每个人在 WebGL 和 OpenGL 中所做的事情。
uniform vec2 u_resolution;
void main()
{
vec2 uv = gl_FragCoord.xy / u_resolution;
// [...]
}
所以,在我的顶点着色器中,我正在做这样的事情:
void main() {
gl_Position = vec4((u_matrix * vec3(a_position, 1)).xy, 0, 1);
}
但现在我在片段着色器中,我想访问该位置。也就是说,我正在寻找一个变量来访问正在绘制的像素的当前位置,但在 clip-space 坐标中。这样做的原因是我希望将该像素与纹理中同一位置的像素混合。
看起来 gl_FragCoord
与我想要的 相似,但它在 window-space 中。我想我可以这样转换它:
vec2 what_i_want = vec2(gl_FragCoord.x / 1920., gl_FragCoord.y / 1080.);
但是我需要知道我的 canvas 尺码。我 可以 传入 canvas 尺寸作为制服,但这似乎有点多。有没有办法在片段着色器中以某种方式访问这个值?
你走在正确的轨道上。您必须在统一变量中设置视口的大小 (canvas)。没有其他选择。这就是每个人在 WebGL 和 OpenGL 中所做的事情。
uniform vec2 u_resolution;
void main()
{
vec2 uv = gl_FragCoord.xy / u_resolution;
// [...]
}