【发布时间】:2016-10-30 16:55:55
【问题描述】:
我发现自己在 webGl 中使用的许多符号和域约定中有点迷失了。看看this regl example(它显示了狒狒测试图像)。以下是我对它的理解:
- 未指定原语;它可能会推断出
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}! - 显示的图像,是,实际上是水平镜像的!! (compare to this) 但它不是垂直镜像的。 在屏幕像素坐标的最终转换过程中必须有其他因素,以抵消 y 中的负因子。
- 但是,Google 搜索没有发现任何证据表明
gl_Position以任何方式相对于屏幕进行镜像。我看到讨论说它是左撇子,但这只是从相对于世界坐标否定z开始。 (e.g. this question here)
简而言之,在我看来,这张图片也应该垂直镜像。
我错过了什么?
后人,代码转载如下:(MIT licensed)
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
})()
【问题讨论】:
-
"clip space," whatever that is,研究有那么难吗?您的大多数其他问题都是特定于框架的,与 WebGL API 无关。您得出结论 {u,v} = -{x,y} 是错误的。 U 和 X 都是从左到右,Y 是从下到上,而 V 是从上到下。
-
@LJᛃ 我看到用词定义的词来定义词......在搜索了很多关于剪辑空间的页面之后,我能推测的最好的结果是,就像 git 暂存区一样,稍后会有意义。
-
另外,“你的前提是错误的”/“uv 到图像像素坐标的映射不是 GL 的一部分”听起来对我来说是一个很好的答案。我没有意识到采样器是由原始数据流构建的。
-
让我改进我之前的陈述,因为它在技术上不正确,UV 坐标的工作方式与从左到右、从下到上的位置坐标 {u,v}={x,y} 相同。问题是纹理数据(正如您已经注意到的那样)直接映射到内存,以便从图像读取的第一行像素位于 V 坐标 0 处(或者如果有除
NEAREST之外的任何采样,则精确到.5 / height被使用)这就是为什么它们看起来是翻转的,为什么我说 V 从上到下。
标签: javascript webgl opengl-es-2.0 regl