【问题标题】:webGL gl_Position value saving outside shaderswebGL gl_Position 值保存外部着色器
【发布时间】:2019-12-23 04:39:51
【问题描述】:

我有用于计算的顶点着色器

 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 值,以便以后在着色器之外使用。有没有办法保存要在着色器之外使用的坐标?

【问题讨论】:

  • 我猜你想研究 gpgpu,本质上将数据写入另一个纹理。
  • 我无法理解这将如何提供帮助?

标签: webgl webgl2


【解决方案1】:

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

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

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

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 操作可能会快得多。底部一个例子here

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

【讨论】:

  • 您能否提供一些示例或参考,说明如何使用转换反馈来恢复(在 javascript - CPU 上)使用 WebGL2 的新顶点位置(在 GPU 使用 gl_Position 更改后)?
  • 有转换反馈示例here,您可以通过调用gl.getSubBufferData从缓冲区中读取值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
相关资源
最近更新 更多