关于webgl2:webGL gl_Position值保存在外部着色器中

webGL gl_Position value saving outside shaders

我有顶点着色器用于计算这样的事情

1
2
3
4
5
 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本身是不可能的。

保存"特定"值也不可行。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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之后,附加到帧缓冲区,然后渲染到该帧缓冲区。结果将在texture

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

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