(原)关于OpenGL中的几个坐标系统的理解
在我们使用opengl做图像处理的过程中,其中必不可少的基本都会用到顶点着色器和片元着色器。
完整的渲染管线图:
那么在这两个着色器程序中,我们需要绘制我们的图像的时候,他们的坐标和位置对应关系是如何的?
这里我们可能会想到坐标系统中介绍的坐标变换,他们涉及了局部空间,世界空间,观察空间,剪切空间,再到屏幕空间。其实这几个坐标系统关联的是对顶点数据的操作,我们可以在CPU中将这几个矩阵的计算应用于顶点数据,然后得到一个结果传递给顶点着色器使用,也可以直接将这几个变换矩阵直接传递进顶点着色器,然后再GPU中进行数据的计算,这都是可以的,然而这整个的计算过程的目的是啥?为的是将处理前的顶点数据处理为我们标准化设备坐标,方便我们映射到屏幕坐标,那么opengl中的顶点数据对应的标准化设备坐标系统是如何的呢?还记得LearnOpenGL中的这个图么?
所以处理过以后的顶点数据,他对应的就是这个坐标系统,值的范围为[-1,1].
所以我们在很多的时候,看到二维图形处理的时候,如果我们在后期不做变换的话,直接定义顶点数据位置,然后传递给顶点着色器中的顶点数据,就是对应的上面这个归一化坐标系统。
例如下面我们将整个视频图像绘制在整个视窗上的话,二维的顶点数据定义如下:
static const float vertex_position[12] = {
-1.0f, -1.0f,
1.0f, -1.0f,
-1.0f, 1.0f,
-1.0f, 1.0f,
1.0f, -1.0f,
1.0f, 1.0f
};
这个定义是我们很常见的。
然后接着再说一下片元着色器中的纹理坐标。我们在片元着色器中,经常性的拿纹理坐标进行贴图,或者进行一些计算,或者啥的其他操作等。
而片元着色器的纹理坐标很多时候会经过这样一个操作,这个是我们常见的,先将纹理坐标数据从CPU传递到顶点着色器中的变量,然后顶点着色器将纹理坐标数据再传递给片元着色器。这样我们贴图的时候,就能将纹理贴到我们所得到的纹理坐标位置了。
那么纹理坐标是否也跟顶点数据一样,有一个归一化的坐标系统呢?
是的,暂且我们就这么喊吧,叫他为纹理归一化坐标系统。同样我们引用learnOpenGL中纹理一节中的图:
纹理坐标值的归一化范围为[0,1],所以如果我们自己定义上面的这个三角形纹理坐标:
float texCoords[] = {
0.0f, 0.0f, // 左下角
1.0f, 0.0f, // 右下角
0.5f, 1.0f // 上中
};
如果中间内容存在错误或者误区,欢迎评论,后续会更正。
转载请注明出处:https://www.cnblogs.com/lihaiping/p/opengl.html
(原)关于OpenGL中的几个坐标系统的理解的更多相关文章
- OpenGL中glPushMatrix和glPopMatrix的原理
glPushMatrix.glPopMatrix操作事实上就相当于栈里的入栈和出栈. 很多人不明确的可能是入的是什么,出的又是什么. 比如你当前的坐标系原点在你电脑屏幕的左上方.如今你调用glPush ...
- OpenGL中glRotatef()函数究竟对矩阵做了什么
OpenGL中glRotatef()函数究竟对矩阵做了什么 我们知道OpenGL中维持着两套矩阵,一个是模型视图矩阵(model view matrix),另一个是投影矩阵(projection ma ...
- OpenGL中的空间变换
OpenGL中的空间变换 在使用OpenGL的三维虚拟程序中.当我们指定了模型的顶点之后.在屏幕上显示它们之前,一共会发生3种类型的变换:视图变换.模型变换.投影变换. ...
- CSharpGL(26)在opengl中实现控件布局/渲染文字
CSharpGL(26)在opengl中实现控件布局/渲染文字 效果图 如图所示,可以将文字.坐标轴固定在窗口的一角. 下载 CSharpGL已在GitHub开源,欢迎对OpenGL有兴趣的同学加入( ...
- OpenGL中坐标系的理解(一)
在OpenGL中,存在着至少存在着三种矩阵,对应着函数glMatrixMode()的三个参数:GL_MODELVIEW,GL_PROJECTION,GL_TEXTURE. 以下主要描述GL_MODEL ...
- CSharpGL(6)在OpenGL中绘制UI元素
CSharpGL(6)在OpenGL中绘制UI元素 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合入 ...
- Opengl中矩阵和perspective/ortho的相互转换
Opengl中矩阵和perspective/ortho的相互转换 定义矩阵 Opengl变换需要用四维矩阵.我们来定义这样的矩阵. +BIT祝威+悄悄在此留下版了个权的信息说: 四维向量 首先,我们定 ...
- OpenGL中glVertex、显示列表(glCallList)、顶点数组(Vertex array)、VBO及VAO区别
OpenGL中glVertex.显示列表(glCallList).顶点数组(Vertex array).VBO及VAO区别 1.glVertex 最原始的设置顶点方法,在glBegin和glEnd之间 ...
- OpenGL中实现双缓冲技术
在OpenGL中实现双缓冲技术的一种简单方法: 1.在调用glutInitDisplayMode函数时, 开启GLUT_DOUBLE,即glutInitDisplayMode(GLUT_RGB | G ...
随机推荐
- Python时间模块。
python中时间的表示方式 unix时间戳,字符串时间,格式化时间 时间模块有,time,datetime,calendar #time模块 import time #获取本地时间戳,返回浮点数 p ...
- python3 networkx
一.networkx 1.用于图论和复杂网络 2.官网:http://networkx.github.io/ 3.networkx常常结合numpy等数据处理相关的库一起使用,通过matplot来可视 ...
- php中的设计模式---工厂模式及单例模式
这两个练习放在一起处理. 在python中,这些模式都有的. 要记得三大类模式:创建型,结构型,行为型. NotFoundException.php <?php namespace Bookst ...
- No root/virtual joint specified in SRDF. Assuming fixed joint
在用MoveIt!配置文件时,加载urdf模型时,显示Success......但没有显示模型,终端显示错误如下: 增加虚拟关节就好.
- C++类库开发详解(转)
前言:这是一篇总结性的文章,需要有一点C++和dll基本知识的基础,在网上查阅了很多资料感觉没有一篇详细.具体.全面的dll开发介绍,我这是根据最近项目和网上资料整理出来的,并附带实例的一个总结性的文 ...
- Spring Boot 中集成 Redis 作为数据缓存
只添加注解:@Cacheable,不配置key时,redis 中默认存的 key 是:users::SimpleKey [](1.redis-cli 中,通过命令:keys * 查看:2.key:缓存 ...
- jmeter对接口测试入参进行MD5加密的5种方式
在使用jmeter做测试的过程中,经常需要对请求的入参进行加密,下面列举几种常用的方法,以登录请求密码需要MD5加密为例. 虽然可以先把参数化的明文密码都先md5加密,而不是在登录前先执行加密,但是实 ...
- linux下使用openssl生成https的crt和key证书
x509证书一般会用到三类文,key,csr,crt Key 是私用密钥openssl格,通常是rsa算法. Csr 是证书请求文件,用于申请证书.在制作csr文件的时,必须使用自己的私钥来签署申,还 ...
- 笨方法学Python3(21-44)
相关代码详见github地址:https://github.com/BMDACMER/Learn-Python 接着前天的总结 习题21:函数可以返回某些东西 定义函数的加减乘除,以及嵌套使用 习题2 ...
- 2.Vue.js 是什么
Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架. 与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用. Vue 的核心库只关注视图层,不仅易于上手,还便 ...