归一化设备坐标
OpenGL的坐标空间是[-1, 1],x,y轴超过该区域的都将被切掉 看不见。
viewport像素是 1280 X 720,归一化后坐标空间从[1280X720],映射到[-1,1]

问题:导致物体变形,因为 x,y轴坐标长度都是1 - (-1)= 2,但x,y轴像素数量不同。y轴像素少,单位坐标就会变长。
办法:设短的轴映射为1,长的轴根据与短轴的比例 映射。[0, 1280] ,[0, 720]--->[-1280/720 , 1280/720],[-1, 1]。这个空间被称作虚拟坐标空间。

OpenGL最终的渲染设备是2D的,我们需要将3D表示的场景转换为最终的2D形式,前面使用模型变换和视变换将物体坐标转换到照相机坐标系后,需要进行投影变换,将坐标从相机—》裁剪坐标系,经过透视除法后,变换到规范化设备坐标系(NDC),最后进行视口变换后,3D坐标才变换到屏幕上的2D坐标,这个过程如下图所示:

在光栅化阶段会做透视分割(或透视除法,即除以第四个分量)。

W 分量是投影仪到屏幕的距离。

在3D计算机图形学中,透视是通过投影矩阵变换,改变每一个向量中 W 分量的值来实现透视的。

透视除法只是将齐次坐标中的 W 分量转换为1的专用名词。

这里需要注意以下,对于attribute类型的属性量。OpenGL会用默认的值替换属性中未指定的分量,前三个分量会被设定为0,最后一个分量w会被设定为1.

图元装配阶段,它实际上做了以下几件事:剪裁坐标、透视分割、视口变换(视变换是将NDC坐标转换为显示屏幕坐标的过程,使用线性映射)。图元装配的输入是顶点着色器的输出,是物体坐标gl_Position,之后到光栅化阶段。

站在gl_position的角度来说,[-w,w]之间的坐标点才是可见的,否则都是不可见会被剪裁掉。往前看,在做投影变换的时候我们说,在视景体内的物体有效,视景体外的会被剪裁,实际上是对应的,剪裁就是发生在图元装配阶段判断所有的坐标是否在[-w,w]之间。

剪裁实际上就是判断每一个最小三角形、直线、点单元的坐标是否规范。

透视除法

对上面的剪裁坐标的点的x、y、z坐标除以它的w分量,除以w的坐标叫做归一化设备坐标。如果w分量大,除以w后的点就接近(0,0,0),在三维空间中,距离我们较远的坐标如果它的w分量较大,进行透视除法后,就距离原点越近,原点作为远处物体的消失点,就有三维场景的效果。

opengl 中的透视除法和NDC相关推荐

  1. OpenGL中投影矩阵(Projection Matrix)详解

    在游戏开发中,一个物体模型从它自身的坐标系转换至我们在屏幕上所见的样子,需要进行一系列的坐标变换以及其他的操作.该过程称为渲染管线.以OpenGL为例: 该过程在以前是被封装的,不能访问.但是现在我们 ...

  2. OpenGL中投影变换矩阵的反向推导

    在OpenGL中有两个重要的投影变换:正交投影(Orthographic Projection)和透视投影(Perspective Projection),二者各有对应的变换矩阵.初学者比较难理解这两 ...

  3. OpenGL中的投影使用

    OpenGL中的投影使用 在OpenGL中,投影矩阵指定了可视区域的大小和形状.对于正投影与透视投影这两种不同的投影类型,它们分别有各自的用途. 正投影 它适用于2D图形,如文本.建筑画图等.在它的应 ...

  4. 关于在Opengl中先平移后旋转和先旋转后平移的效果不一样的原因

    一.现象 在OpenGL中先移动后旋转与先旋转后移动的最终效果是并不一定相同的,也就是说在Opengl中如果调用函数glTranslatef和函数glRotatef的次序不同,即使参数一样,效果也可能 ...

  5. openGL中的坐标系

    openGL中使用的是右手坐标系 右手坐标系:伸开右手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向 左手坐标系:伸开左手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手 ...

  6. OpenGL中的曲面细分和几何着色器

    [摘要]本文我们先介绍OpenGL中的曲面细分的一些基本概念,然后给两个例子说明不得不用这项技术的理由. 曲面细分是OpenGL 4.0之后才定义的功能,使用之前请确认你的显卡驱动支持OpenGL4. ...

  7. OpenGL中投影函数glOrtho()、glFrustum()以及gluPerspective()以及函数的用法

    OpenGL中,如果想对模型进行操作,就要对这个模型的状态(当前的矩阵)乘上这个操作对应的一个矩阵. 如果乘以变换矩阵(平移, 缩放, 旋转), 那相乘之后, 模型的位置被变换; 如果乘以投影矩阵(将 ...

  8. OpenGL中的坐标变换、矩阵变换

    OpenGL中六种常见坐标系: 1. Object or model coordinates(模型坐标系) 2. World coordinates(世界坐标系) 3. Eye (or Camera) ...

  9. 【OpenGL】关于OpenGL中Bind函数的理解

    在OpenGL中,总是会遇到类似下面的绑定语句: glBindTexture(GL_TEXTURE_2D, renderTex); glBindFramebuffer(GL_FRAMEBUFFER, ...

  10. opengl中的Floatbuffer和IntBuffer与java中数据的存储方式不同的解决方法,编辑一个自己的BufferUtil工具类

    opengl中的Floatbuffer和IntBuffer与java中数据的存储方式不同的解决方法,编辑一个自己的BufferUtil工具类 参考文章: (1)opengl中的Floatbuffer和 ...

最新文章

  1. [资料整理] Decentralized Services Orchestration, Choreography相关的几篇论文
  2. php接口图片转二进制,怎么在php项目中对图片进行二进制转换
  3. Vue实现仿音乐播放器3-将项目托管到git以及github
  4. Web Api 基于Zookeeper的服务注册与发现
  5. FatFs源码剖析(2)
  6. 28 | 堆和堆排序:为什么说堆排序没有快速排序快?
  7. 【Hadoop】Bad connect ack with firstBadLink as ×.×.×.×:50010
  8. static 关键字的作用
  9. 冒泡排序之Java实现
  10. 清除回收站苦闷纠结欣喜
  11. 2021 王道考研 计算机组成原理+习题讲解
  12. onlyoffice开发java,利用 ONLYOFFICE 将在线文档编辑器集成到 Python Web 应用程序中
  13. C++求矩阵最大值和最小值
  14. Java内存结构模型
  15. python数据分析师 前景_数据分析师的前景怎么样? 本人是程序员,最近对数据分析有兴趣……...
  16. 命令集matlab,Matlab常用命令集2
  17. 【Python学习笔记(二)】使用Pyinstaller将不同路径下的py文件打包成exe可执行文件
  18. Flask项目之个性化微电影网站的实战开发(一)
  19. 国内那么多AI专业,为什么国内却没有ChatGPT?
  20. 2021第7届中国大学生程序设计竞赛CCPC广州站, 签到题4题

热门文章

  1. nbu里oracle备份al开头的,认识NBU备份Oracle时Code 29错误
  2. Tomcat怎么重启 tomcat重启命令
  3. ureport2报表详细使用(六)-图表展示
  4. 小米笔记本pro 双硬盘双系统 opencore引导安装黑苹果
  5. 【MySQL】--数据库锁机制
  6. ts视频文件的爬取与合并
  7. LTE网络架构和协议栈
  8. (三)进程各种id:pid、pgid、sid、全局pid、局部pid
  9. DSkin的TabControl在设计视图报错
  10. 2018药品目录匹配_本位码_众联社本位码匹配工具2018版破解版