Webgl 计算正交投影矩阵的函数

Webgl 计算正交投影矩阵的函数,webgl,fragment-shader,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

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

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和zFar在那里代表什么吗?我试着把一些值放在那个里,它改变了包装图像的形状,但奇怪的是,即使
zNear
zFar
大,它也能以某种方式工作

你能告诉我这个函数的意思和它最后的作用吗?

但是如果你按照下面的专栏

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

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

第3列和第4列有效地使
zNear
zFar
的区域进入Z剪辑空间(在相机前面),一旦事物被w分割。因为第4列使用的是
Z
(第3行下方),所以这是透视矩阵而不是正交矩阵

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

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

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

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

第3列和第4列有效地使
zNear
zFar
的区域进入Z剪辑空间(在相机前面),一旦事物被w分割。因为第4列使用的是
Z
(第3行下方),所以这是透视矩阵而不是正交矩阵

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


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

“我有一个图像要环绕圆柱体,所以我在谈论正交投影。”嗯,什么?您正在尝试将纹理投影到圆柱体上吗?另外,您使用的是桌面OpenGL、OpenGL ES还是WebGL?因为它们不尽相同。好吧,对不起。是的,我想将纹理投影到圆柱体上。我使用的是webGL,但我认为碎片着色器在任何地方都是一样的…@Nicolas和顺便说一句。你不知道它可能是什么吗?我指的是问题中提到的函数…“我有一个图像,我想环绕圆柱体,所以我说的是正交投影。”嗯,什么?您正在尝试将纹理投影到圆柱体上吗?另外,您使用的是桌面OpenGL、OpenGL ES还是WebGL?因为它们不尽相同。好吧,对不起。是的,我想将纹理投影到圆柱体上。我使用的是webGL,但我认为碎片着色器在任何地方都是一样的…@Nicolas和顺便说一句。你不知道它可能是什么吗?我指的是问题中提到的功能。首先非常感谢您的回复。正如你所说,这是透视矩阵。这是否意味着该矩阵定义了摄影机的位置,并且摄影机查看的场景是透视图?将某些
平截头体的空间
(如一面比另一面小的立方体)转换为两个单位的立方体,每个维度为+1到-1。是定义摄影机位置和方向的内容。由于您没有相机矩阵,您的相机位于原点,向下看-Z轴。首先非常感谢您的回复。正如你所说,这是透视矩阵。这是否意味着该矩阵定义了摄影机的位置,并且摄影机查看的场景是透视图?将某些
平截头体的空间
(如一面比另一面小的立方体)转换为两个单位的立方体,每个维度为+1到-1。是定义摄影机位置和方向的内容。由于您没有相机矩阵,因此您的相机位于原点,向下看-Z轴。