WebGL blit纹理到画布

时间:2013-01-22 00:26:00

标签: canvas webgl textures blit

在WebGL中将纹理blitting到HTML画布的最简洁方法是什么?我可以看到设置正交投影并渲染纹理四边形,但有更简洁的方法吗?

1 个答案:

答案 0 :(得分:0)

什么意思“将纹理blitting到HTML5 Canvas”?你的意思是只是在画布上绘制1x1像素的纹理吗?无需正投影。最简单的方法是制作一个单位四边形和比例尺或制作像素坐标和绘制四边形。

这是像素coord quad shader

attribute vec2 a_position;
attribute vec2 a_texCoord;

uniform vec2 u_resolution;

varying vec2 v_texCoord;

void main() {
   // convert the rectangle from pixels to 0.0 to 1.0
   vec2 zeroToOne = a_position / u_resolution;

   // convert from 0->1 to 0->2
   vec2 zeroToTwo = zeroToOne * 2.0;

   // convert from 0->2 to -1->+1 (clipspace)
   vec2 clipSpace = zeroToTwo - 1.0;

   gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);

   v_texCoord = a_texCoord;
}

这个例子来自这里。 (http://games.greggman.com/game/webgl-image-processing/)

单位四元版本的比例偏移将是

attribute vec2 a_position;
attribute vec2 a_texCoord;

uniform vec2 u_offset;
uniform vec2 u_scale;

varying vec2 v_texCoord;

void main() {
   gl_Position = vec4(a_position * u_scale + u_offset, 0, 1);

   v_texCoord = a_texCoord;
}

最后,在任何一种情况下,您都可以使用3x3矩阵数学来简化代码

attribute vec2 a_position;

uniform mat3 u_matrix;

void main() {
  // Multiply the position by the matrix.
  gl_Position = vec4((u_matrix * vec3(a_position, 1)).xy, 0, 1);
}

然后设置矩阵。您可以使用单位四元组(添加比例矩阵以放大像素)或使用像素。

的矩阵
[
  2 / canvasWidth, 0, 0,
  0, -2 / canvasHeight, 0,
  -1, 1, 1
]

将从像素转换为剪辑空间。

的矩阵
[
  imageWidth, 0, 0,
  0, imageHeight, 0,
  0, 0, 1
]

将从单位四元组转换为图像大小。

对于这个答案来说,进入所有矩阵数学似乎太多了但是如果你有兴趣可以在这里找到它请参阅http://games.greggman.com/game/webgl-2d-matrices/