Canvas WebGL blit纹理到画布
在WebGL中,将纹理分插到HTML画布的最干净方式是什么。我可以看到设置正交投影和渲染带纹理的四边形,但有更干净的方法吗?什么是“将纹理拼接到HTML5画布”?你是说在画布上画一个1x1像素的纹理?不需要正交投影。最简单的方法是制作一个单位四边形并缩放,或者在像素坐标中制作一个四边形并绘制 这是像素坐标四边形着色器Canvas WebGL blit纹理到画布,canvas,webgl,textures,blit,Canvas,Webgl,Textures,Blit,在WebGL中,将纹理分插到HTML画布的最干净方式是什么。我可以看到设置正交投影和渲染带纹理的四边形,但有更干净的方法吗?什么是“将纹理拼接到HTML5画布”?你是说在画布上画一个1x1像素的纹理?不需要正交投影。最简单的方法是制作一个单位四边形并缩放,或者在像素坐标中制作一个四边形并绘制 这是像素坐标四边形着色器 attribute vec2 a_position; attribute vec2 a_texCoord; uniform vec2 u_resolution; varying
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
]
将从像素转换为clipspace。矩阵
[
imageWidth, 0, 0,
0, imageHeight, 0,
0, 0, 1
]
将从单位四边形转换为图像的大小
对于这个答案来说,进入所有的矩阵数学似乎太多了,但是如果你感兴趣,你可以在这里找到它。看制作一个大屏幕四边形,然后在xy屏幕位置将精灵纹理复制到该四边形中,不是更好吗?我不知道答案,只是好奇:)