计算正交投影矩阵的函数

时间:2016-05-11 14:31:58

标签: webgl fragment-shader

我获得了着色器代码(顶点和片段),我的目标是添加一些功能。但是我很难理解一些函数和数学内部。我有一个图像,我想将此图像的纹理投影到圆柱体上。这就是我从纹理中获取像素的方法:

float hFOV=0.0789;      // orizontal field of view
float aspectRatio=1.5;  
float ax = tan(hFOV * M_PI);
float ay = ax / aspectRatio;
vec4 q1 = myW2N(ax,ay,1.,6.) * vec4(d, 1.); // ??    
vec2 p = q1.xy / q1.w;
p = 0.5 * (p + 1.0);
vec4 c = texture2D(foto, p);

但令我头疼的是myW2N()功能,我无法理解内部的想法以及结果意味着什么。我只是认为这会创建投影矩阵。为了向您展示这个功能的主体:

mat4 myW2N(float ax, float ay, float zNear, float zFar) {
    float cx = 1.0 / ax;
    float cy = 1.0 / ay;
    float z0 = -zNear;
    float z1 = -zFar;
    float az = (z0 + z1) / (z0 - z1);
    float bz = (1. - az) * z0;
    return mat4(
        cx, 0., 0., 0.,
        0., cy, 0., 0.,
        0., 0., az, bz,
        0., 0., -1., 0.
        );
    }

有谁可以告诉我zNeat and zFar代表什么?我试图在那里放置一些值,它会改变包裹图像的形状,但即使zNear大于zFar,它仍然有点奇怪。

你能告诉我这个功能最终意味着什么,最后它做了什么?

1 个答案:

答案 0 :(得分:2)

You might want to read up on how matrices work但如果您按照

列进行操作

第一列将X乘以1 / ax,这意味着它将从+/-ax单位缩放到剪辑空间+/-1

对于从+/-ay到剪辑空间的Y缩放,第二列将执行相同的操作。

第3列和第4列有效地使zNearzFar的区域进入Z剪辑空间(在摄像机前面),一旦将事物除以w。因为第4列使用Z(第3行向下),所以这是透视矩阵而不是正交矩阵。

然后将

d乘以该矩阵。下一行vec2 p = q1.xy / q1.w;实际上是p一个2d剪辑空间透视坐标。 p = 0.5 * (p + 1.0)之后的行从剪辑空间2d转换为纹理空间2d

您的片段中没有与柱面相关的代码