webGL gl_位置值保存外部着色器

webGL gl_位置值保存外部着色器,webgl,webgl2,Webgl,Webgl2,我有一些顶点着色器用于类似这样的计算 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\u位置本身是不

我有一些顶点着色器用于类似这样的计算

 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\u位置本身是不可能的

保存“特定”值听起来也不可能

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

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_计数提供数据。您可以创建一个浮点纹理(在启用
OES\u texture\u float
EXT\u color\u buffer\u float
后,附加到帧缓冲区,然后渲染到该帧缓冲区。结果将在纹理中

请注意,将位置数据本身放入纹理并执行更多普通GPGPU操作可能会快得多


在WebGL2中,还可以使用变换反馈。变换反馈将顶点着色器的输出写入一个或多个缓冲区。在WebGL2中,使用着色器版本300 es,可以将顶点着色器中的变量声明为
out
,而不是
varying
。这些
out
值(如上所述,不是
gl\u Position
本身,而是您自己声明的输出可以写入缓冲区。

我想您应该看看gpgpu,将数据写入另一个纹理。我不明白这有什么帮助?