如何构造y轴正交x轴透视的投影矩阵
How to construct projection matrix with ortho-ish in y-axis and perspective in x-axis
我将如何创建一个映射坐标的矩阵:
近平面
x: [-3,3] -> [-1,1]
y: [-6,2] -> [-1,1]
z: 2 -> -1
远位面
x: [-4,4] -> [-1,1]
y: [-4,4] -> [-1,1]
z: 0 -> 1
我可以在具有特殊功能的顶点着色器中完成,但如果可能的话,我想使用投影矩阵来完成。
vec4 special_projection(vec4 p){
float ty = 0.25 * p.z;
float tx = 0.25 * p.x;
float xz = (tx / 3.0) * (p.z / 2.0);
float x = tx + xz;
float y = 0.25 * p.y + ty;
float z = -0.5 * p.z;
return vec4(x,y,z,1);
}
你想要的是在你工作的 4d 齐次 space 中不能用矩阵乘法表示。
要获得正确的透视划分,您需要将 w_clip
设置为 z_eye
的某个线性函数。标准的 GL 约定是 w_clip = -z_eye
,我将在这里使用它。要获得没有透视变形的 y
,您需要将 y_clip
乘以 w_clip = - z_eye
。
您当然可以将任何公式写入您喜欢的着色器,但请注意,按照您打算的方式扭曲 space,插值的透视校正将产生您可能不会产生的结果期待。
我将如何创建一个映射坐标的矩阵:
近平面
x: [-3,3] -> [-1,1]
y: [-6,2] -> [-1,1]
z: 2 -> -1
远位面
x: [-4,4] -> [-1,1]
y: [-4,4] -> [-1,1]
z: 0 -> 1
我可以在具有特殊功能的顶点着色器中完成,但如果可能的话,我想使用投影矩阵来完成。
vec4 special_projection(vec4 p){
float ty = 0.25 * p.z;
float tx = 0.25 * p.x;
float xz = (tx / 3.0) * (p.z / 2.0);
float x = tx + xz;
float y = 0.25 * p.y + ty;
float z = -0.5 * p.z;
return vec4(x,y,z,1);
}
你想要的是在你工作的 4d 齐次 space 中不能用矩阵乘法表示。
要获得正确的透视划分,您需要将 w_clip
设置为 z_eye
的某个线性函数。标准的 GL 约定是 w_clip = -z_eye
,我将在这里使用它。要获得没有透视变形的 y
,您需要将 y_clip
乘以 w_clip = - z_eye
。
您当然可以将任何公式写入您喜欢的着色器,但请注意,按照您打算的方式扭曲 space,插值的透视校正将产生您可能不会产生的结果期待。