我发现自己在 webGl 中使用的许多符号和域约定中有点迷失了。看一下这个 regl 示例(它显示了狒狒测试图像)。以下是我对它的理解:
- 未指定原语;它很可能推断
GL_TRIANGLE
。 - 因此,它在世界空间中创建了一个具有顶点
(-2, 0)
、(0, -2)
、的三角形表面。(2, 2)
在纸上画出来,似乎是专门选择了这个,因为它包含了这个区域[0,1] x [0,1]
。 uv
从世界空间中获取它的值,包括这个[0,1] x [0,1]
区域(它是 的域texture2d
)。如果我理解正确,约定是+u
指向图像的右边缘,+v
指向顶部。gl_Position
设置为1 - 2*uv
,以便图像占据[-1,1] x [-1,1], z=0
“剪辑空间”,无论是什么。- 更重要的是,这也意味着方向对应!
+{u,v}
-{x,y}
- 显示的图像,实际上是水平镜像的!!(与此相比)但它不是垂直镜像的。 在与屏幕像素坐标的最终转换过程中必须有其他东西抵消了 y 中的负因子。
- 然而,谷歌搜索并没有发现
gl_Position
任何与屏幕相关的证据。我看到讨论说它是左撇子,但这只是z
相对于世界坐标的否定。(例如这里的这个问题)
简而言之,在我看来,这个图像也应该垂直镜像。
我错过了什么?
为了后代,代码复制如下:(MIT许可)
const regl = require('regl')()
const baboon = require('baboon-image')
regl({
frag: `
precision mediump float;
uniform sampler2D texture;
varying vec2 uv;
void main () {
gl_FragColor = texture2D(texture, uv);
}`,
vert: `
precision mediump float;
attribute vec2 position;
varying vec2 uv;
void main () {
uv = position;
gl_Position = vec4(1.0 - 2.0 * position, 0, 1);
}`,
attributes: {
position: [
-2, 0,
0, -2,
2, 2]
},
uniforms: {
texture: regl.texture(baboon)
},
count: 3
})()