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轴。