webGL gl_Position 在着色器外节省价值

webGL gl_Position value saving outside shaders

我有像这样计算的顶点着色器

 gl_Position =
      vec4(a.x * (0.5 - b.x) * v -
               a.y * b.y * u - offset * offsetMul * u,
           0, 0) +
      transform * vec4(position, 0, 1);

我需要保存 gl_Position 的特定值,以便以后在着色器之外使用。有什么方法可以保存坐标在着色器之外使用吗?

保存 gl_Position 本身是不可能的 AFAICT。

保存 "a particular" 值听起来也不可能。

可以保存所有值。您可以渲染位置

attribute vec4 position;    // your data
attribute float a_count;    // count 0, 1, 2, 3
uniform vec2 u_resolution;  // resolution of output texture

// vertex shader
varying vec4 v_position;

void main() {
  v_position =
      vec4(a.x * (0.5 - b.x) * v -
               a.y * b.y * u - offset * offsetMul * u,
           0, 0) +
      transform * vec4(position, 0, 1);
  vec2 pixelCoord = vec2(
      mod(a_count, resolution.x);
      floor(a_count / resolution.x));
  vec2 clipSpaceCoord = (pixelCoord + 0.5) / resolution * 2.0 - 1.0;

  gl_Position = vec4(clipSpaceCoord, 0, 1);
}

// fragment shdaer
precision highp float
varying vec4 v_position;
void main() {
  gl_FragColor = v_position;
}

在上面的例子中,我们将创建一个填充计数 0、1、2、3 等的缓冲区,以向上面的 a_count 提供数据。您将创建一个浮点纹理(启用 OES_texture_floatEXT_color_buffer_float 后,附加到帧缓冲区,然后渲染到该帧缓冲区。结果将在纹理

请注意,将位置数据本身放入纹理并执行更多普通 GPGPU 操作可能会快得多。底部的一个示例

在 WebGL2 中,您还可以使用变换反馈。变换反馈将顶点着色器的输出写入一个或多个缓冲区。在 WebGL2 中,使用着色器版本 300 es,您在顶点着色器中将 varyings 声明为 out 而不是 varying。那些 out 值(所以像上面一样,不是 gl_Position 本身而是你自己声明的输出可以写入缓冲区。