在OpenGL和GLSL中,我只是学习透视投影和顶点着色器。但是,我对实际需要传递给顶点着色器的数据以及需要在着色器代码本身中执行的操作感到有些困惑。
我有两个问题:
假设我在3D坐标(x,y,z)中定义了一个三角形。我是否需要传递带有值(x,y,z,w)的4D向量,其中w = z?或者我只是传递3D矢量?我问的原因是我知道在管道中的某个地方,x和y坐标除以w分量,在透视除法中。
在顶点着色器代码中,我是否需要自己用w组件手动划分x和y组件?或者这是自动处理吗?
谢谢!
答案 0 :(得分:0)
OpenGL实现在顶点和片段着色器之间进行透视划分。
您可以在顶点着色器中输入任何内容;透视分割发生在gl_Position
变量上的顶点着色器之后,即vec4
。
(我不知道镶嵌着色器如何适合这个)
答案 1 :(得分:0)
我们知道,OpenGL中有6个space
:
model/object space
- 同质模型坐标:(x,y,z,1),以真实单位
`model-world transform`
world space
- 世界坐标:(x,y,z,1),以真实单位
`world-view transform`
view/camera/eye space
- 眼睛坐标:(x,y,z,1),以真实单位
`perspective projection`/`orthographic projection`
clip space
- 齐次剪辑坐标:(x,y,z,w)OpenGL true input
`projective division`
NDC space
- 规范化设备坐标--- x->( - 1,1),y->( - 1,1),z->(0,1)
window space
- 窗口坐标:(x,y),以像素为单位,深度坐标:z->(0,1)
所以答案是:
Q1:perspective projection
自动将(x,y,z,1)转换为(x,y,z,w)。
Q2:不,你不是。 OpenGL true input
之后的任何内容都可以由OpenGL自动完成,您无法在顶点着色器中控制它。