【问题标题】:WebGL blit texture to canvasWebGL blit 纹理到画布
【发布时间】:2013-01-05 03:42:43
【问题描述】:

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

【问题讨论】:

    标签: canvas webgl textures blit


    【解决方案1】:

    “向 HTML5 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;
    }
    

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

    【讨论】:

    • 制作一个大屏幕四边形然后将精灵纹理复制到该四边形的 xy 屏幕位置不是更好吗?我不知道答案,只是好奇:)
    猜你喜欢
    • 2019-01-26
    • 2020-11-17
    • 2015-01-28
    • 2014-07-24
    • 2021-07-24
    • 2014-04-29
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多