步履蹒跚

知其然,知其所以然 - real-time rendering.
posts - 85, comments - 172, trackbacks - 0, articles - 0

如何计算投影纹理坐标 - 补充

Posted on 2005-01-12 12:25 Pointer 阅读(2515) 评论(8)  编辑 收藏 网摘 所属分类: 开发随笔

原文见:http://www.cnblogs.com/Pointer/archive/2004/12/20/79323.html

最近通过学习固定渲染管线的光栅化过程,终于明白了扭曲的原因。

我们先设V=投影变换前的顶点,V'=投影变换后的齐次顶点。

在屏幕空间中,V的各项属性并不是线性分布的,但1/Vz是线性分布的,对于其它的顶点属性Vb/Vz也是线性分布的(《Mathematics for 3D Game Programming & Computer Graphics》上有详细的证明),所以我们进行插值的时候应该先对1/Vz进行线性插值,然后对Vb/Vz也进行线性插值,最后将Vb/Vz的插值结果乘以1/Vz插值结果的倒数,得到Vb的插值结果。

又因为V'w= -Vz(推导见投影矩阵的推导),所以我们一般用1/V'w来替代1/Vz。

而我在进行纹理投影的时候,将投影变换后的齐次顶点坐标投影到了三维的空间中(即:<V'x/V'w, V'y/V'w, V'z/V'w>),然后用glVertex3f将该坐标传入了固定渲染管线,这样的话就使得纹理坐标的插值由非线性插值变为了线性插值,导致了最终结果的扭曲。

其实直接用glVertex4f将V'传入固定渲染管线,由固定渲染管线进行透视矫正的话,即可消除这种扭曲现象。



Feedback

#1楼    回复  引用    

2005-01-12 21:13 by nicky [未注册用户]
恭喜,结果正确。呵呵

pointer在作3d引擎么?

#2楼 [楼主]   回复  引用  查看    

2005-01-13 09:22 by Pointer      
没有呀,只是想学习一下固定渲染管线的流程。*^^*

#3楼    回复  引用    

2005-02-06 20:32 by xheartblue [未注册用户]
所以说,在Cg HLSL里,Sampler的函数有 Tex2Dproj和Tex2D的区别,在Tex2D里,会自动除 w 分量的。

#4楼    回复  引用    

2005-02-06 20:33 by xheartblue [未注册用户]
说错了。是tex2dproj会自动除

#5楼 [楼主]   回复  引用  查看    

2005-02-06 23:00 by Pointer      
谢谢心蓝兄指点。:D

GLSL里也有texture2DProj,应该也是实现相同功能的。

#6楼    回复  引用    

2005-05-17 14:20 by 小小 [未注册用户]
我为什么去nivida的网站下cg总出问题.帮个忙嘛,解释下,你们都下了吗

#7楼    回复  引用    

2005-06-27 09:33 by new [未注册用户]
请问opengl中glTenGen可以实现在球面上进行投影纹理吗?

#8楼    回复  引用    

2006-07-30 13:46 by w3ishi [未注册用户]
我来根据个人看法补充一下object linear和eye linear的区别:
GL_OBJECT_LINEAR在任何时候都是用物体的顶点坐标来计算纹理坐标。而使用GL_EYE_LINEAR时一定要注意顺序,如果在glTexGenfv(GL_S, GL_EYE_PLANE, Plane);这个函数调用之前有过模型视图变换,则会用变换后的顶点坐标(这时物体已经经过模型试图变换,也就是所谓的eye空间坐标)乘以模型视图变换的逆矩阵,其实这时的结果就是变换前的物体坐标。而如果glTexGenfv(...)在变换前调用,则其实是物体的eye坐标乘以了一个单位矩阵,所以,结果当然是...
所以使用texgen时一定要注意顺序。

以上是一些个人的体会,如果有不正确的地方,希望各位指教。




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-01-12 12:30 编辑过
Google站内搜索

相关文章:

相关链接: