如何将 shadertoy 移植到使用投影矩阵的顶点?

How I can port a shadertoy into a vertex that is using a projection matrix?

我正在尝试将此 shadertoy 移植到 OpenGL https://www.shadertoy.com/view/7lBBR3

Shadertoday 有一个 vec4 fragCoord 和一个 vec3 iResolution;,我不确定如何将其转换为我的 OpenGL 着色器。

我有一个像这样投影的 2D 平面:

glm::vec3 camera = {0.f, 0.f, -5.f};
glm::vec3 projection = glm::perspective(glm::radians(45.f), app.aspectRatio, 0.1f, 100.f);
projection = glm::scale(projection, {1.f, -1.f, 1.f});
glm::mat view = glm::translate(projection, camera);

然后我的顶点着色器像这样使用这个视图

layout(location = 0) in vec2 vPosition;
layout(location = 1) in vec2 vTexturePosition;

layout(location = 0) out vec2 position;
layout(location = 1) out vec2 texturePosition;

layout(binding = 0) uniform ubo {
  mat4 uView;
};

void main() {
  gl_Position = uView * vec4(vPosition, 0.f, 1.f);
  texturePosition = vTexturePosition;
}

所以现在我不确定如何继续,在 shadertoy 着色器中你可以看到这样的行

vec3 planeposition = vec3(fragCoord.xy / iResolution.y, 0.0);
vec2 cursorposition = iMouse.xy / iResolution.y;
vec2 uv = fract(fragCoord.xy / iResolution.y);
vec2 noise = fract(fragCoord.xy * 0.5);

由于我使用的是投影矩阵,因此我认为 iResolution 无关紧要,因为它只是视口的大小(以像素为单位)。 另外,fragCoord 是什么?我的 vPosition 是来自顶点缓冲区吗?

Shadertoy 的着色器专为屏幕 space 渲染通道而设计。 iResolution 始终是视口的大小。 iMouse是鼠标指针的window坐标。 fragCoord与片段着色器built-in统一gl_FragCoord相同。因此,如果您的矩形覆盖了整个视口,您只需创建并设置 iResolutioniMouse 制服并将 fragCoord 替换为 gl_FragCoord。 请注意,您不能完全省略 iResolution,因为它还包括视口的纵横比。