在我们使用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中的几个坐标系统的理解的更多相关文章

  1. OpenGL中glPushMatrix和glPopMatrix的原理

    glPushMatrix.glPopMatrix操作事实上就相当于栈里的入栈和出栈. 很多人不明确的可能是入的是什么,出的又是什么. 比如你当前的坐标系原点在你电脑屏幕的左上方.如今你调用glPush ...

  2. OpenGL中glRotatef()函数究竟对矩阵做了什么

    OpenGL中glRotatef()函数究竟对矩阵做了什么 我们知道OpenGL中维持着两套矩阵,一个是模型视图矩阵(model view matrix),另一个是投影矩阵(projection ma ...

  3. OpenGL中的空间变换

    OpenGL中的空间变换          在使用OpenGL的三维虚拟程序中.当我们指定了模型的顶点之后.在屏幕上显示它们之前,一共会发生3种类型的变换:视图变换.模型变换.投影变换.        ...

  4. CSharpGL(26)在opengl中实现控件布局/渲染文字

    CSharpGL(26)在opengl中实现控件布局/渲染文字 效果图 如图所示,可以将文字.坐标轴固定在窗口的一角. 下载 CSharpGL已在GitHub开源,欢迎对OpenGL有兴趣的同学加入( ...

  5. OpenGL中坐标系的理解(一)

    在OpenGL中,存在着至少存在着三种矩阵,对应着函数glMatrixMode()的三个参数:GL_MODELVIEW,GL_PROJECTION,GL_TEXTURE. 以下主要描述GL_MODEL ...

  6. CSharpGL(6)在OpenGL中绘制UI元素

    CSharpGL(6)在OpenGL中绘制UI元素 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合入 ...

  7. Opengl中矩阵和perspective/ortho的相互转换

    Opengl中矩阵和perspective/ortho的相互转换 定义矩阵 Opengl变换需要用四维矩阵.我们来定义这样的矩阵. +BIT祝威+悄悄在此留下版了个权的信息说: 四维向量 首先,我们定 ...

  8. OpenGL中glVertex、显示列表(glCallList)、顶点数组(Vertex array)、VBO及VAO区别

    OpenGL中glVertex.显示列表(glCallList).顶点数组(Vertex array).VBO及VAO区别 1.glVertex 最原始的设置顶点方法,在glBegin和glEnd之间 ...

  9. OpenGL中实现双缓冲技术

    在OpenGL中实现双缓冲技术的一种简单方法: 1.在调用glutInitDisplayMode函数时, 开启GLUT_DOUBLE,即glutInitDisplayMode(GLUT_RGB | G ...

随机推荐

  1. 说说openjdk及G1回收器日志内容详细分析

    谈谈openjdk: 在正式往下学习JVM之前,这里谈谈openjdk这个网站,这个在学习java并发时也用过它来分析过锁的底层实现,如:https://www.cnblogs.com/webor20 ...

  2. httprunner学习13-环境变量.env

    前言 一般来说,在进行实际应用的开发过程中,应用会拥有不同的运行环境,通常会有以下环境: 本地开发环境 测试环境 生产环境 在不同环境中,我们可能会使用不同的数据库或邮件发送驱动等配置,这时候则需要通 ...

  3. ArcGIS 10.2 JavaScript API本地部署离线开发环境

    1 获取ArcGIS JavaScript API API的下载地址http://support.esrichina.com.cn/2011/0223/960.html,在下载页面会看到api和sdk ...

  4. wordpress导航当前页面菜单高亮显示如何操作

    我们在制作wordpress主题时有些客户要求导航在访问某个菜单时,这个菜单项会高亮显示,让用户知道自己正在访问的是哪个菜单下的内容,这个要如何实现呢?wordpress早就为你想好了,.curren ...

  5. call和apply的模拟实现

    call 一句话介绍 call: call() 方法在使用一个指定的 this 值和若干个指定的参数值的前提下调用某个函数或方法. 举个例子: var foo = { value: 1 }; func ...

  6. 伯克利套接字(BSD Socket)

    http://blog.csdn.net/blueman2012/article/details/6693605#socket.28.29 伯克利套接字(Berkeley sockets),也称为BS ...

  7. python--面向对象编程之学生选课系统练习

    1.系统目录结构 文件夹注解: bin--系统管理员和学生的主程序代码 config--系统的配置文件 db--系统的数据文件 admin--管理员的数据文件 student--学生的数据文件 lib ...

  8. Js 日期字符串分别截取 年 月 日 时 分 秒

    function shijiantime(times){ var timearr = times.replace(" ", ":").replace(/\:/g ...

  9. 【概率DP】$P2059$ 卡牌游戏

    链接 题目描述 N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X,则庄家 ...

  10. P3350 [ZJOI2016]旅行者

    题目描述 小Y来到了一个新的城市旅行.她发现了这个城市的布局是网格状的,也就是有n条从东到西的道路和m条从南到北的道路,这些道路两两相交形成n*m个路口 (i,j)(1<=i<=n,1&l ...