归一化设备坐标
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. NVIDIA CUDA-X AI
  2. 64位开源处理器Rocket该人士介绍
  3. 【转载】ATI显卡在Ubuntu下设置方法(很全面)
  4. 什么是matlab中的fints函数,Matlab基本函数
  5. 线程队列,线程池和协程
  6. 如何使用用window.open()
  7. 思维-CF-739A
  8. xpath里面if判断一个值不为空_现代C++之模板元编程(今天写个If与While)
  9. linux系统恢复上一次,如何将您的Ubuntu Linux系统恢复到其上一个状态
  10. 保罗兰德作品赏析_保罗兰德——理想化的设计师人生
  11. 系统管理员不可不知的三条黄金法则
  12. Python深度学习(3):波士顿房价预测
  13. Qt实现 员工培训管理系统
  14. Java 最佳学习途径
  15. data[i] is underfined
  16. 用计算机弹出记事本,win7电脑开机就会弹出Desktop.ini记事本怎么办?
  17. mysql connect reset_困扰我多年的Connection reset问题
  18. 炒菜机器人放食材的顺序_九阳发布了一堆厨电:要用“进化”颠覆人类的饮食、厨房生活...
  19. 《web前端面试题》第一问-如何快速居中对齐?
  20. BUUWeb刷题记录

热门文章

  1. nginx 支持HTTPS fdfs
  2. java tomcat热部署_intellij idea tomcat热部署配置教程
  3. js 实现2的n次方计算函数_x的10的n次方解决js浮点数计算
  4. NitroShare —— 跨平台的局域网文件传输工具
  5. 挂单html模板,修改标签模板(指令打印)
  6. prince2 成功的项目管理_PRINCE2项目管理方法论
  7. steam安装包_Steam已经绑定了令牌,为什么还会频繁被盗?
  8. 2022年,消费品牌如何把握新的商业脉络?
  9. 使用matlab时括号附近出现红色波浪线“使用的MATLAB语法可能无效”提示
  10. MovieLens电影推荐系统