[原创教程]OpenGL渲染管线和坐标变换,震撼发布!!!!!

张赐 2010-01-27 04:42:35
加精
看到论坛上很多同学问坐标转换的问题,什么屏幕坐标转世界坐标等等,看来很多同学都没有弄清楚图形管线是怎么回事。
一旦弄清楚了渲染管线,有关于这类的问题都可以迎刃而解。于是我用了两天的时间来完成这个OpenGL的教程, 绝对的原创
希望这篇教程能够给大家帮助~

本来想发到blog,由于最近bolg不能上传图片,于是免费给大家提供下载,希望大家多多提建议。

大家顶啊!!!

下面是该教程目录

////////////////////////////////////////////////////////////////

目 录

1. 引言
2. OpenGL渲染管线
2.1 模型观测变换(ModelView Transformation)
2.2 投影变换(Projection Transformation)
2.2.1 正交投影(Orthogonal Projection)
2.2.2 透视投影(Perspective Projection)
2.3 视口变换(View port Transformation)
3. 屏幕坐标转换为世界坐标
4. 总结

////////////////////////////////////////////////////////////////


下面是从教程中随机取出的一部分

-----------------------------------------------------------
......

2.2投影变换

先还是复习一下OpenGL的渲染管线。图2.1中可以看到,在投影变换(Projection Transformation)中也分为两个部分,第一个部分是将上个阶段得到的坐标转换为平面坐标,第二个部分是将转换后的平面坐标在进行归一化并进行剪裁。一般地,将三维坐标转换为平面坐标有两种投影方式:正交投影(Orthogonal Projection)和透视投影(Perspective Projection)。

2.2.1 正交投影

正交投影很简单,如图2.8,对于三维空间中的坐标点和一个二维平面,要在对应的平面上投影,只需将非该平面上的点的坐标分量改为该平面上的坐标值,其余坐标不变。比如将点(1,1,5)正交投影到z=0的平面上,那么投影后的坐标为(1,1,0)。
在openGL中,设置正交投影可以使用函数

glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)

该函数可以设置正交投影的投影空间,在该空间以外的坐标点就不会被投影到投影平面上。函数中的六个参数分是投影空间六个平面,如图2.9。在图2.9中,大的投影空间是根据这六个参数设置的投影空间,OpenGL会自动将该空间归一化,也就是将该空间或立方体转化为变长为1的正六面体投影空间,并且该证六面体的中心在相机坐标系的原点。一旦设置使用glortho函数设置投影空间,OpenGL会生成投影矩阵。这个矩阵的作用就是将坐标进行正交投影并且将投影后的坐标正规化(转换到-1到1之间)。要注意的是,生成该矩阵的时候,OpenGL会把右手坐标系转换为左手坐标系。原因很简单,右手坐标系的Z轴向平面外的,这样不符合我们的习惯。该矩阵的矩阵推导这里就不详细说明了,不了解的同学可以参考游戏数学方面资料,这里只给出正交投影矩阵。

......

现在到了最后一个阶段了。这个阶段叫做视口变换,它把上个阶段得到的正规化的投影坐标转化为windows 窗口坐标。视口变换会将投影平面上的画面映射到窗口上。在OpenGL中可以使用函数

GLAPI void GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);

来进行对窗口的映射,如图2.13。举个例子说明,比如上个阶段中得到了一个顶点的坐标为(0,0,0.5,1),根据这个坐标,该顶点位于投影平面的正中间。如果将该点映射到大小为50*50的窗口上时,那么它应该位于屏幕的中间,坐标为(25,25, 0.5,1)。当然这里深度值0.5是不会改变的。有的同学肯定有疑问了,既然投影到了窗口上,那么还要深度值0.5干什么?这里要注意的是,虽然在窗口上显示时只需要x,y坐标就够了,但是要在2D窗口上显示3D图形时深度值是不可少的。这里的深度值不是用于显示,而是用于在光栅化的时候进行深度测试。




教程下载地址:http://download.csdn.net/source/2027238


...全文
6876 128 打赏 收藏 转发到动态 举报
写回复
用AI写文章
128 条回复
切换为时间正序
请发表友善的回复…
发表回复
xcytdn 2012-09-25
  • 打赏
  • 举报
回复
学习了,谢谢版主
chenzhouduanlang 2012-08-13
  • 打赏
  • 举报
回复
挺好的,已经下载了,努力收藏中!
没有昵称阿 2012-07-20
  • 打赏
  • 举报
回复
这个必须顶一下~~

图形管线和坐标变换一直是我非常困扰的两个地方~~
黑石猴子 2012-07-06
  • 打赏
  • 举报
回复
这个世界就需要楼主这样的奉献者
AmxxStart 2012-05-27
  • 打赏
  • 举报
回复
学习中,谢谢楼主分享
_佚名-2022_ 2012-05-16
  • 打赏
  • 举报
回复
好东西,共享万岁……
okvee 2012-02-10
  • 打赏
  • 举报
回复
虚, 不要告诉别人
一介丶草民 2011-11-30
  • 打赏
  • 举报
回复
支持版主。
没有昵称阿 2011-11-12
  • 打赏
  • 举报
回复
这个必须顶啊~~
csdn网速很慢 2011-11-07
  • 打赏
  • 举报
回复
楼主很好。
constanline 2011-10-03
  • 打赏
  • 举报
回复
好东西~谢谢楼主分享
林洋 2011-09-24
  • 打赏
  • 举报
回复
顶个。。。。。起来
youou003 2011-09-07
  • 打赏
  • 举报
回复
exceed_me 2011-08-22
  • 打赏
  • 举报
回复
下载了,认真阅读了,楼主真的非常用心,包括格式,内容,组织上,都非常棒!
tangxianghenggood 2011-08-17
  • 打赏
  • 举报
回复
只想说一句:爱死你了
想请教一下,对于初学者,学openGl好些还是学dx好些?谢谢
the_venus 2011-08-08
  • 打赏
  • 举报
回复
楼主和以上各位真的太NX了,小弟在这里谢谢了。不过小弟想看看有关于OpenGL Feedback相关的教程,麻类烦好心人给我讲下吗?
hualangx1 2011-08-01
  • 打赏
  • 举报
回复
老大,还要2个论坛币呀,不是免费吗,我没钱呀,我想看
cdm2179 2011-08-01
  • 打赏
  • 举报
回复
这个LZ太有爱了,看过你的博客不错啊
udumbara007 2011-07-15
  • 打赏
  • 举报
回复
为什么我结贴了却没有返回的分数,现在居然连贴都不能发了
fixed 2011-07-05
  • 打赏
  • 举报
回复
不得不顶
加载更多回复(95)

8,301

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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