如何在WebGL中的剪辑空间坐标中找到当前输出像素位置?

问题描述 投票:0回答:2

所以,在我的顶点着色器中我正在做这样的事情:

void main() {
  gl_Position = vec4((u_matrix * vec3(a_position, 1)).xy, 0, 1);
}

但现在我在片段着色器中,我想访问该位置。也就是说,我正在寻找一个变量来访问正在绘制的像素的当前位置,但在剪辑空间坐标中。这样做的原因是我希望将该像素与纹理中同一位置的像素混合。

看起来

gl_FragCoord
与我想要的类似,但它在窗口空间中。我想我可以像这样转换它:

vec2 what_i_want = vec2(gl_FragCoord.x / 1920., gl_FragCoord.y / 1080.);

但是我需要知道我的画布尺寸。我可以将画布尺寸作为制服传递,但这似乎有点太多了。有没有办法在片段着色器中以某种方式访问这个值?

javascript glsl shader webgl
2个回答
3
投票

您走在正确的道路上。您必须在统一变量中设置视口(画布)的大小。没有其他选择。这就是每个人在 WebGL 中所做的事情,就像在 OpenGL 中一样。

uniform vec2 u_resolution;

void main()
{
    vec2 uv = gl_FragCoord.xy / u_resolution;

    // [...]
}

0
投票

根据您使用的渲染系统,传递统一的分辨率可能并不方便。一种更简单的方法是简单地从顶点着色器到片段着色器创建一个

varying
,该片段着色器接收
gl_Position
值并相应地对其进行插值。

顶点着色器:

// ...
varying vec4 v_clipPos;
// ...

void main() {
    // ...
    gl_Position = u_projViewTrans * a_position;
    v_clipPos = gl_Position;
    // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.