游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3660|回复: 5

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

[复制链接]

1

主题

60

帖子

70

积分

注册会员

Rank: 2

积分
70
发表于 2004-12-23 14:18:00 | 显示全部楼层 |阅读模式
最近在做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写错了还是我的理解有误。  [em24]

2

主题

50

帖子

58

积分

注册会员

Rank: 2

积分
58
发表于 2004-12-24 10:36:00 | 显示全部楼层

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

REDBOOK没写错
但是这样写很容易造成误解:)

这样:
(Xe, Ye, Ze, We)是眼坐标系中的顶点坐标,M^-1是模型视图矩阵的逆矩阵。(M-1)(Xe, Ye, Ze, We)是gl帮你做得。

那么再做GL_EYE_LINEAR的时候,(注意,是在texgen的gl call发生的时候)GL提取当前modelview矩阵,即是矩阵堆栈的栈顶。
这里modelview不一定要是obj->eye的变换。比如如果你想(M-1)(Xe, Ye, Ze, We)得到world coord,那么你就应该把M设为eye transform(world->eye)。

1

主题

60

帖子

70

积分

注册会员

Rank: 2

积分
70
 楼主| 发表于 2004-12-24 16:48:00 | 显示全部楼层

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

REDBOOK确实是错的。我用比较土的办法证明了一下。

根据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模式。这和我们实际观察到的结果相同。

1

主题

60

帖子

70

积分

注册会员

Rank: 2

积分
70
 楼主| 发表于 2004-12-24 16:53:00 | 显示全部楼层

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

REDBOOK上关于Automatic Texture-Coordinate Generation的解释:

http://rush3d.com/reference/opengl-redbook-1.1/chapter09.html

2

主题

50

帖子

58

积分

注册会员

Rank: 2

积分
58
发表于 2004-12-24 18:52:00 | 显示全部楼层

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

...
看来你没有认真看我的回复呢

推荐你看看
http://www.nvidia.com/object/Projective_Texture_Mapping.html

1

主题

60

帖子

70

积分

注册会员

Rank: 2

积分
70
 楼主| 发表于 2004-12-24 19:44:00 | 显示全部楼层

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

你的意思是模型视图矩阵里面并不一定非要存真正的模型视图变换矩阵吧。这倒也是。

不过我认为REDBOOK还是将GL_OBJECT_LINEAR和GL_EYE_LINEAR模式的解释搞混了。
GL_EYE_LINEAR运算根本没有ModelViewMatrix参与。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-23 20:54

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表