canvas - WebGL blit 纹理到 Canvas

标签 canvas webgl textures blit

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

最佳答案

“向 HTML5 Canvas 发送纹理”是什么意思?你的意思是只是在 Canvas 上绘制一个 1x1 像素的纹理?不需要正投影。最简单的方法是制作一个单位四边形并缩放,或者在像素坐标中制作一个四边形并绘制。

这是像素坐标四边形着色器

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;
}

这个例子来自here。 (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/

关于canvas - WebGL blit 纹理到 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14449599/

相关文章:

javascript - 创建一个透明圆柱体

c++ - 无法向 GL_QUAD 添加纹理

c++ - SFML window.draw();只出现一小段时间

firefox - 为什么 threejs 应用程序不能在 mozilla firefox 中运行

javascript - HTML5 的 Canvas + Javascript 代码在 iOS 上不起作用

javascript - 多个图像的 context.drawImage 最终导致 FireFox 崩溃

delphi - 由于什么设计原因,TCanvas.StretchDraw 无法按 TIcon 的预期工作?

javascript - 如何实现图像360度旋转

android - 在 libgdx 中管理桌面和设备版本之间的 Assets

javascript - 将 CSS3 matrix3D 绘制到 Canvas 2D 元素