我正在尝试在javascript中执行与顶点着色器相同的变换。我的顶点着色器正在转换顶点,就像典型的WebGL示例一样:
gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition,1.0)
我的画布是600x600px(但在这种情况下,画布大小无关紧要。)
结果gl_Position.xy不是我的预期。它不是在0,600或-300,300或-1,1范围内,而是大约-6,6。 (我最终在着色器中编写了测试,例如:如果转换后的gl_Position.x> 5.0将其染成红色。)
无论画布大小如何,-6,6(或12x12)绘图区域都保持不变。
添加比例因子并通过眼睛调整后,我设法将我的javascript变换与着色器变换同步。但是如何从WebGL获取变换顶点的绘图区域的大小?这个-6,6范围是如何确定的?
答案 0 :(得分:3)
如果你真的想要匹配顶点变换,你忽略了一些发生 AFTER 可编程顶点变换的操作。
您忘记了gl_Position.xyz
在获得您在问题中讨论的NDC或屏幕空间坐标之前仍有一些转换。
在顶点着色器之后和光栅化之前(pos.xyz
/ = pos.w
)
pos.w
始终为1.0
...
http://www.songho.ca/opengl/files/gl_transform02.png
顶点着色器的输出在此图中标记为Clip Coordinates
(剪辑空间),您应该知道原始装配和光栅化是最终转换为Window Coordinates
(屏幕空间)的地方完成。此外,上面要点中讨论的两个操作不是可编程管道的一部分。
如果您想知道,该图表来自Song Ho Ahn(안성호)的网站。这是一篇标题为『OpenGL Transformation』的文章的一部分,这可能有助于强化我在这个答案中所讨论的内容。