opengl 中的透视除法和NDC
归一化设备坐标
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相关推荐
- OpenGL中投影矩阵(Projection Matrix)详解
在游戏开发中,一个物体模型从它自身的坐标系转换至我们在屏幕上所见的样子,需要进行一系列的坐标变换以及其他的操作.该过程称为渲染管线.以OpenGL为例: 该过程在以前是被封装的,不能访问.但是现在我们 ...
- OpenGL中投影变换矩阵的反向推导
在OpenGL中有两个重要的投影变换:正交投影(Orthographic Projection)和透视投影(Perspective Projection),二者各有对应的变换矩阵.初学者比较难理解这两 ...
- OpenGL中的投影使用
OpenGL中的投影使用 在OpenGL中,投影矩阵指定了可视区域的大小和形状.对于正投影与透视投影这两种不同的投影类型,它们分别有各自的用途. 正投影 它适用于2D图形,如文本.建筑画图等.在它的应 ...
- 关于在Opengl中先平移后旋转和先旋转后平移的效果不一样的原因
一.现象 在OpenGL中先移动后旋转与先旋转后移动的最终效果是并不一定相同的,也就是说在Opengl中如果调用函数glTranslatef和函数glRotatef的次序不同,即使参数一样,效果也可能 ...
- openGL中的坐标系
openGL中使用的是右手坐标系 右手坐标系:伸开右手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向 左手坐标系:伸开左手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手 ...
- OpenGL中的曲面细分和几何着色器
[摘要]本文我们先介绍OpenGL中的曲面细分的一些基本概念,然后给两个例子说明不得不用这项技术的理由. 曲面细分是OpenGL 4.0之后才定义的功能,使用之前请确认你的显卡驱动支持OpenGL4. ...
- OpenGL中投影函数glOrtho()、glFrustum()以及gluPerspective()以及函数的用法
OpenGL中,如果想对模型进行操作,就要对这个模型的状态(当前的矩阵)乘上这个操作对应的一个矩阵. 如果乘以变换矩阵(平移, 缩放, 旋转), 那相乘之后, 模型的位置被变换; 如果乘以投影矩阵(将 ...
- OpenGL中的坐标变换、矩阵变换
OpenGL中六种常见坐标系: 1. Object or model coordinates(模型坐标系) 2. World coordinates(世界坐标系) 3. Eye (or Camera) ...
- 【OpenGL】关于OpenGL中Bind函数的理解
在OpenGL中,总是会遇到类似下面的绑定语句: glBindTexture(GL_TEXTURE_2D, renderTex); glBindFramebuffer(GL_FRAMEBUFFER, ...
- opengl中的Floatbuffer和IntBuffer与java中数据的存储方式不同的解决方法,编辑一个自己的BufferUtil工具类
opengl中的Floatbuffer和IntBuffer与java中数据的存储方式不同的解决方法,编辑一个自己的BufferUtil工具类 参考文章: (1)opengl中的Floatbuffer和 ...
最新文章
- [资料整理] Decentralized Services Orchestration, Choreography相关的几篇论文
- php接口图片转二进制,怎么在php项目中对图片进行二进制转换
- Vue实现仿音乐播放器3-将项目托管到git以及github
- Web Api 基于Zookeeper的服务注册与发现
- FatFs源码剖析(2)
- 28 | 堆和堆排序:为什么说堆排序没有快速排序快?
- 【Hadoop】Bad connect ack with firstBadLink as ×.×.×.×:50010
- static 关键字的作用
- 冒泡排序之Java实现
- 清除回收站苦闷纠结欣喜
- 2021 王道考研 计算机组成原理+习题讲解
- onlyoffice开发java,利用 ONLYOFFICE 将在线文档编辑器集成到 Python Web 应用程序中
- C++求矩阵最大值和最小值
- Java内存结构模型
- python数据分析师 前景_数据分析师的前景怎么样? 本人是程序员,最近对数据分析有兴趣……...
- 命令集matlab,Matlab常用命令集2
- 【Python学习笔记(二)】使用Pyinstaller将不同路径下的py文件打包成exe可执行文件
- Flask项目之个性化微电影网站的实战开发(一)
- 国内那么多AI专业,为什么国内却没有ChatGPT?
- 2021第7届中国大学生程序设计竞赛CCPC广州站, 签到题4题