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

标签 javascript glsl shader webgl

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

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.);

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

最佳答案

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

uniform vec2 u_resolution;

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

    // [...]
}

关于javascript - 如何在 WebGL 的裁剪空间坐标中找到当前输出像素位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67249767/

相关文章:

javascript - JQuery 创建一个随机的 16 位数字可能吗?

opengl - glsl 输出和输入的命名约定

opengl - GLSL 入门

opengl - 在 OpenGL 中找不到属性变量,可能的优化

DirectX 世界 View 矩阵乘法 - GPU 或 CPU 的地方

javascript - 在更改时获取微调器 ui 值

javascript - javascript 代码中显示的 this.value 未定义消息

opengl - GLSL 中的椭圆梯度旋转

c++ - DirectX 中两个矩形的透明度,一个在另一个后面 - 我看到窗口的背景而不是第二个纹理

javascript - 在显示页面之前运行脚本