现在前面的废话:最近好事不断!十分开心!生活真美好!

好了今天要梳理一下,顶点输入的具体过程,同样也是渲染管线中的第一个阶段的详细过程的介绍。之前介绍过,OpenGL操作的是一组3D坐标,所以我们的输入也必须是包含了x,y,z这三个方向,并且将他们放入一个数组之中。

加入我们要画出一个三角形,先看如下表示

这里的每三个为一组坐标,并且注意,OpenGL不是简单地把所有的3D坐标变换为屏幕上的2D像素;OpenGL仅当3D坐标在3个轴(x、y和z)上都为-1.0到1.0的范围内时才处理它。这就是为啥我们给出的范围是1.0>坐标>-1.0。因为超出这个位置的地方,opengl不做处理。当然不处理的话就不会渲染出图形。

好了现在我们需要在引入一个名叫标准化设备坐标,当我们的顶点被顶点着色器处理过后,他们就变成标准化坐标。这里注意新的坐标轴与我们通常的屏幕坐标轴不同,通常我们屏幕坐标轴的中心在左上角,而这种坐标的中心在整个图像的中心。如下图所示。

好了确定好了三个顶点的位置,那么OpenGL是怎么知道我想要那个数组中那三个组成一个顶点呢?换句话说,目前我们所创建的那个数组即将被我们传入了顶点着色器,而我们的顶点着色器会专门在GPU上创建好空间储存他们,但是OpenGL还不知道我们要怎么解释这些点的作用,打个比方就是,材料放到厨房了,厨师还不知道你想吃啥样的菜,所以他没动。

在这之前我们再引入一个新概念,顶点缓冲对象(Vertex Buffer Objects, VBO),如果每次只传入一个点,这样会浪费很多效率,所以我们用VBO来管理这个地方上的内存(注意这里还没进入GPU),让我们一次性传输多个顶点进入显存(同时受VBO管理),而我们的顶点着色器可以几乎很快从现存里读取数据。

OpenGL有很多缓冲对象类型,顶点缓冲对象的缓冲类型是GL_ARRAY_BUFFER。我们可以使用glBindBuffer函数把新创建的缓冲(VBO)绑定到GL_ARRAY_BUFFER目标上。这里这个对象GL_ARRAY_BUFFER,可以看作成一个是一个结构体里面有很多东西需要我们去适配,而绑定到这个对象上可以理解为我们,之后所有对GL_ARRAY_BUFFER的缓冲调用,都将用于配置其中的缓冲这里配置的就是VBO。

好的,还记得我们的那个数组吗?现在我们赶紧从之前定义的数组里面复制一份数据到我们的VBO里面来。这里使用glBufferData(GL_ARRAY_BUFFER,sizeof(vertex),vertex,GL_STATIC_DRAW).

第一个参数表示我们想要操作的对象的类型,这里直接写定点缓冲对象的类型,第二个是数组容量,第三个是你想要复制进VBO的目标,最后一个比较特殊。我们知道当,显卡运转的时候VBO会反复传递资源给显存,那么这里有个问题,如果我们的VBO里面的数据不经常改变的话,总是传了又传很占资源。所以最后一个设置为GL_STATIC_DRAW,因为我们仅仅想显示一个固定图像,不需要其他操作。此外还有这些选择

  • GL_STATIC_DRAW :数据不会或几乎不会改变。
  • GL_DYNAMIC_DRAW:数据会被改变很多。
  • GL_STREAM_DRAW :数据每次绘制时都会改变。
    好了今天暂时总结到这。争取下次快点更新!

Opengl_入门学习分享和记录_02_渲染管线(一)顶点输入的更多相关文章

  1. Opengl_入门学习分享和记录_02_渲染管线(一)顶点着色器&片段着色器

    写在前面的废话:今天俺又来了哈哈,真的好棒棒! 今天的内容:之前我们大概描述了,我们自己定义的顶点坐标是如何被加载到GPU之中,并且介绍了顶点缓冲对象VBO用于管理这一块内存.今天开始详细分析它的具体 ...

  2. Opengl_入门学习分享和记录_03_渲染管线(二)再谈顶点着色器以及顶点属性以及属性链接

    ---恢复内容开始--- 写在前面的废话:岂可修!感觉最近好忙啊,本来今天还有同学约我出去玩的.(小声bb) 正文开始:之前已经编译好的着色器中还有一些问题,比如 layout(location=0) ...

  3. Opengl_入门学习分享和记录_03_渲染管线(三)借助顶点数组对象VAO提高绑定属性效率

    目前我们已经知道了,如果想要顶点着色器解释理解我们的输入数据,就必须要按照以下繁琐的步骤:第一步:将输入的数据复制一份到缓冲区,供OpenGL使用.而这块新出现的区域由VBO管理和表示.(若有多个输入 ...

  4. Opengl_入门学习分享和记录_00

    2019.7.4 本着对游戏创作的热情,本人初步了解了一部分的unity引擎的使用,也学习了一点C#可是越学习unity我就反而对引擎内部感兴趣(不知道有没有一样的朋友=,=). 接着了解到了open ...

  5. Opengl_入门学习分享和记录_01_Graphics Pipeline(图形渲染管线)

    写在前面的废话: 这个系列拖更了很久,很大一定程度上是由于自己最近忙着高数学习和线代学习..感觉时间特别紧缺(其实就是我太懒了)好了不废话了,总结开始. 正文开始: 首先Graphics Pipeli ...

  6. Opengl_入门学习分享和记录_番外篇01(MacOS上如何在Xcode 开始编辑OpenGL)

    写在前面的废话: 哈哈 ,我可真是勤勉呢,今天又来更新了,这篇文章需要大家接着昨天的番外篇00一起食用! 正文开始: 话不多说,先看代码. 这里主要全是使用的glfwwindowhint 这个函数,他 ...

  7. Opengl_入门学习分享和记录_番外篇00(MacOS上如何给Xcode 适配openGL)

    现在前面的废话:哇这次没有鸽太久,突然想起来还没有介绍如何适配opengl的衍生库.今天一并介绍下,同样看时间允不允许,让我再把之前学到的一些东西再次总结一遍. 正文开始: 首先大家要知道我们的Ope ...

  8. Redis入门学习(学习过程记录)

    Redis(入门笔记) 学习一个大的技术点,然后顺带着就把这个技术点的面试题给学习了. 学习完一个技术后,如果面试题还不能够解答的话,只能说明学的不精,需要查漏补缺. 下一个学习的方向:Redis-非 ...

  9. Bootstrap入门学习笔记(只记录了效果)

    基本头文件 <!DOCTYPE html> <html> <head> <title>Bootstrap 实例</title> <me ...

随机推荐

  1. web前端css(一)

    一  css的引入方式: 1)    行内样式:     <p style=”color: green”>我是一个段落</p> 2)    内接样式: <style ty ...

  2. 基于SpringCloud的Microservices架构实战案例

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  3. BZOJ4152 The Captain(dijkstra+巧妙建图)

    BZOJ4152 The Captain 题面很简洁: 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. 很明显 ...

  4. mybatis学习(五)(动态mybatis(多条件查询))

    有时候要查询条件是多条件的,尤其是使用mybatis的时候如何创建sql语句呢? 这里mybatis有自己的办法,如下: 案例:通过传入map,根据map里面的数据来查询 mapper配置如下: &l ...

  5. python爬虫笔记之re.compile.findall()

    re.compile.findall原理是理解了,但输出不大理解(主要是加了正则表达式的括号分组) 一开始不懂括号的分组及捕捉,看了网上这个例子(如下),然而好像还是说不清楚这个括号的规律(还是说我没 ...

  6. 精美的在线icon

    super-tiny-icons(0.2.1)列表 序号 名称 图标 地址 是否使用 1 acast.svg https://cdn.jsdelivr.net/npm/super-tiny-icons ...

  7. Java中lambda表达式详解

    原文地址:http://blog.laofu.online/2018/04/20/java-lambda/ 为什么使用lambda 在java中我们很容易将一个变量赋值,比如int a =0;int ...

  8. HTTPS协议学习笔记

    在前一段时间准备面试的时候,面试官反复提到了HTTPS这个协议.我只是单纯的知道,HTTPS是安全的应用层协议 是HTTP更安全的版本,通过对称密钥加密.但是具体的其他的,可能我不太了解.今天就专门抽 ...

  9. Android基础知识复习之打开照相机拍照并获取照片

    对于我来说,做一件事情: 首先要理清我的思路,我要打开照相机,我能想到的是:在Android中我要打开系统应用,肯定需要一个隐式意图,那就要查询Android照相机的源码,查看并找到意图过滤器的书写方 ...

  10. [剑指offer] 3. 从头到尾打印链表

    题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 思路: 利用容器,遍历一遍加入到一个新容器里,然后反置输出. vector 用 reverse stack 则直接一个个出栈 ...