OGL自动纹理坐标生成的一点疑惑

void_pointer 2004-12-23 02:21:26
最近在做Project Texture的时候遇到了一点问题,所以非常想知道纹理坐标自动生成的本质。

在OGL REDBOOK中是这样描述用GL_EYE_LINEAR模式来生成纹理坐标的:


Sometimes you'd like the contour lines to be calculated relative to the eye's coordinate system. In other words, you want to multiply the vector (p1p2p3p4) by the inverse of the modelview matrix before calculating the distance to the plane. If you specify GL_TEXTURE_GEN_MODE with GL_EYE_LINEAR, this is exactly what happens. The texture coordinate is generated with the following function:

generated coordinate = p1'xe + p2'ye + p3'ze + p4'we
where (p1' p2' p3' p4') = (p1p2p3p4)M-1

In this case, (xe, ye, ze, we) are the eye coordinates of the vertex, and p1, ..., p4 are supplied as the param argument to glTexGen*() with pname set to GL_EYE_PLANE.


其中
(Xe, Ye, Ze, We)是眼坐标系中的顶点坐标,也就是经过了模型视图变换后的顶点坐标吧。
(M-1)是模型视图矩阵的逆矩阵。
那么(M-1)(Xe, Ye, Ze, We)的本质是将模型的顶点坐标变换到最初始时的位置。

那这样实际上不就是GL_OBJECT_LINEAR模式了吗?

不知道是REDBOOK写错了还是我的理解有误。 :(
...全文
241 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
void_pointer 2004-12-24
  • 打赏
  • 举报
回复
我用了一个土办法证明了一下:

根据RedBook的解释,在自动纹理坐标生成中,GL_OBJECT_LINEAR模式不需要使用模型视图矩阵,GL_EYE_LINEAR模式需要使用模型视图矩阵。那么我们可以做一系列试验验证上述结论:

1 使用GL_EYE_LINEAR模式生成纹理坐标。设置模型视图矩阵与投影矩阵,让OGL用固定渲染管线进行坐标变换。
试验结果:程序结果正常,纹理坐标同眼坐标相关,随眼坐标的变化而变化。

2 使用GL_EYE_LINEAR模式生成纹理坐标。将模型视图矩阵置为单位矩阵,自己进行模型视图变换,仅让OGL在固定管线中做投影变换。
试验结果:程序结果正常。

3 使用GL_OBJECT_LINEAR模式生成纹理坐标。设置模型视图矩阵与投影矩阵,让OGL用固定渲染管线进行坐标变换。
试验结果:程序结果正常,纹理坐标用物体坐标相关,不随眼坐标的变化而变化。

4 使用GL_OBJECT_LINEAR模式生成纹理坐标。将模型视图矩阵置为单位矩阵,自己进行模型视图变换,仅让OGL在固定管线中做投影变换。
试验结果:程序结果异常,效果同GL_EYE_LINEAR模式。

结论:GL_EYE_LINEAR模式不需要使用模型视图矩阵;GL_OBJECT_LINEAR模式需要使用模型视图矩阵。

另外,如果我们假设RedBook确实弄反了,那么GL_OBJECT_LINEAR模式下的自动纹理坐标生成的公式就是:
T = (P * M-1) * VT;
在试验4中我们将模型视图矩阵设置为单位矩阵,那么就又有:
T = (P * M-1) * VT = P * VT;
结果同GL_EYE_LINEAR模式。这和我们实际观察到的结果相同。

这里起码能够证明REDBOOK上关于GL_EYE_LINEAR模式和GL_OBJECT_LINEAR模式自动生成纹理坐标的公式不正确。
Sn_Yugo 2004-12-24
  • 打赏
  • 举报
回复
伤心,还要用马甲顶才能继续回复。
Sn_Yugo 2004-12-24
  • 打赏
  • 举报
回复
伤心,还要用马甲顶才能继续回复。
void_pointer 2004-12-24
  • 打赏
  • 举报
回复
晕了,绕来绕去又绕回去了。
最终的结果还是和GL_OBJECT_LINEAR模式得到的相同。纹理坐标和模型的世界坐标相关,与照相机位置无关。

几何意义上也好理解:
把平面变换到照相机坐标系中,然后求同在照相机空间中的顶点到该平面的距离

把照相机坐标系中的顶点变换到世界坐标系下,然后求变换后的顶点到本来就在世界坐标系下的平面的距离。
意义是一样的。

本来矩阵运算也满足结合率嘛。
(P(M-1))Ve = P((M-1)Ve)

程序的实际结果也是这样。我怀疑确实是REDBOOK把GL_OBJECT_LINEAR和GL_EYE_LINEAR模式搞反了。
void_pointer 2004-12-23
  • 打赏
  • 举报
回复
谢谢happy__888([顾问团]寻开心)。 :D
用平面来解释的话这种变换的几何意义就明了多了。明天自己来尝试实现一下,看看效果。
void_pointer 2004-12-23
  • 打赏
  • 举报
回复
就是因为想了解本质,所以要自己实现啊。:)
syy64 2004-12-23
  • 打赏
  • 举报
回复
自动纹理坐标计算对专门的模型,有专门的函数。
寻开心 2004-12-23
  • 打赏
  • 举报
回复
写错了
是顶点在相机坐标下的坐标
p1 p2 p3 p4 是用来指定一个在世界坐标系下的平面的参数
p1 p2 p3 应该是平面的法向量 p4是距离
对平面的变换也是依照法向量变换原则的,需要使用视矩阵的逆来处理

注意在这个时候乘法的方向都不同 是向量在左边,矩阵在右边
一般的乘法是矩阵在左边,点在右边的
解释也在那个文章当中的



寻开心 2004-12-23
  • 打赏
  • 举报
回复
opengl里面关于自动纹理坐标生成,没有dx里面对于这个问题解释的清楚
dx里面可以用顶点的法向量在相机坐标系的数值作为纹理坐标
可以用顶点的位置在相机坐标系的数值做为纹理坐标
可以用 反射向量 作为纹理坐标
opengl里面关于这个解释不清晰
但是我觉得它就是用的法向量在相机空间当中的数值来做的,否则上面的解释不通
void_pointer 2004-12-23
  • 打赏
  • 举报
回复
多谢happy__888([顾问团]寻开心)啦 :D

确实一直没有想过法线变换矩阵与顶点变换矩阵有什么不同之处,这下明了了不少。

不过这里还有另外一个问题:
你说“不是点的变换,是法向量变换”,这句话意思还不是很明白。
这句话是指:
自动纹理坐标生成中的纹理坐标是由顶点的法线得来的,而非由顶点坐标得来的?
故因为Ve并非顶点而是法线,所以 M-1 * Ve 这个操作并非是将顶点变换到最初始的位置?
寻开心 2004-12-23
  • 打赏
  • 举报
回复
这里主要是对法向量的变换的问题
不是点的变换,是法向量变换
如果M是变换矩阵,N是法向量,那么,M变换后的法向量N' = N* (Minverse)
关于这个,你可以看看
http://xreal.51.net/Game/NormalMatrix.htm

这点必须注意,
同一个变换矩阵对于点,向量,以及法向量的变换结果可不都是数学上矩阵的M*P这一个表达式

4,499

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧