私は、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
です。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
})()
[* "クリップ空間、" それは*であるものは何でも](http://www.songho.ca/opengl/gl_transform.html)をlearingについては、研究がそれは難しいということですか?その他の質問の多くは、フレームワーク固有のもので、WebGL APIには関係しません。あなたは{u、v} = - {x、y}が間違っていると結論づけます。 UとXの両方が左から右に移動しますが、Yは下から上に移動し、Vは上から下に移動します。 –
@LJ words言葉の言葉で定義された単語を参照してください...クリップ空間に関する多くのページを探した後、私が推測できる最高のものは、gitステージエリアのように*後で意味をなさなくなります* –
また、 "あなたの前提は間違っていた"/"イメージピクセル座標へのUVのマッピングはGLの一部ではありません。サンプラーが生データストリームから構築されたことは分かりませんでした。 –