为什么这个图像没有垂直镜像?

Exp*_* HP 5 javascript webgl opengl-es-2.0 regl

我发现自己在 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
})()
Run Code Online (Sandbox Code Playgroud)