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_float
和 EXT_color_buffer_float
后,附加到帧缓冲区,然后渲染到该帧缓冲区。结果将在纹理
中
请注意,将位置数据本身放入纹理并执行更多普通 GPGPU 操作可能会快得多。底部的一个示例
在 WebGL2 中,您还可以使用变换反馈。变换反馈将顶点着色器的输出写入一个或多个缓冲区。在 WebGL2 中,使用着色器版本 300 es,您在顶点着色器中将 varyings 声明为 out
而不是 varying
。那些 out
值(所以像上面一样,不是 gl_Position
本身而是你自己声明的输出可以写入缓冲区。
我有像这样计算的顶点着色器
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_float
和 EXT_color_buffer_float
后,附加到帧缓冲区,然后渲染到该帧缓冲区。结果将在纹理
请注意,将位置数据本身放入纹理并执行更多普通 GPGPU 操作可能会快得多。底部的一个示例
在 WebGL2 中,您还可以使用变换反馈。变换反馈将顶点着色器的输出写入一个或多个缓冲区。在 WebGL2 中,使用着色器版本 300 es,您在顶点着色器中将 varyings 声明为 out
而不是 varying
。那些 out
值(所以像上面一样,不是 gl_Position
本身而是你自己声明的输出可以写入缓冲区。