OpenGL学习笔记第二课--Hello Triangle

完整版原文地址:https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/

https://learnopengl.com/Getting-started/Hello-Triangle

1.三个概念 

  • 顶点数组对象:Vertex Array Object,VAO
  • 顶点缓冲对象:Vertex Buffer Object,VBO
  • 索引缓冲对象:Element Buffer Object,EBO或Index Buffer Object,IBO

2.在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2D像素。3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线(Graphics Pipeline,大多译为管线,实际上指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程)管理的

2D坐标和像素也是不同的,2D坐标精确表示一个点在2D空间中的位置,而2D像素是这个点的近似值,2D像素受到你的屏幕/窗口分辨率的限制。

下面,你会看到一个图形渲染管线的每个阶段的抽象展示。要注意蓝色部分代表的是我们可以注入自定义的着色器的部分

实际的obj文件不仅有顶点数组,还包含uv,索引等,从obj到顶点数组需要经过VBO和VAO

 

一个AVO可以可以持有两种类型的buffer ,GL_ARRAY_BUFFER和GL_ELEMENT_ARRAY_BUFFER

在现代OpenGL中,我们必须定义至少一个顶点着色器和一个片段着色器(因为GPU中没有默认的顶点/片段着色器)

流水线流程

3.造一个VAO

在适当的位置,如在glViewport之后造一个VAO

	unsigned int VAO;
	glGenVertexArrays(1, &VAO);//glGenVertexArrays方法可以产生多个VAO,第一个参数代表产生的VAO个数,第二个参数是VAO对象的地址,这个函数返回一个VAO ID填充到变量VAO中
    //扩展 由于glGenVertexArays可以返回多个ID当需要产生多个VAO时,如10个,需定义一个数组接受函数返回值
    /*
    unsigned int VAO[10];
    glGenVertexArrays(10,AVO); //数组名就是数组的首地址
     
    */

4.将造完的VAO绑定到渲染管道

使用glBindVertexArray函数,此函数需要一个ID作为参数

	unsigned int VAO;
	glGenVertexArrays(1, &VAO);//glGenVertexArrays方法可以产生多个VAO,第一个参数代表产生的VAO个数,第二个参数是VAO对象的地址,这个函数返回一个VAO ID填充到变量VAO中
    //扩展 由于glGenVertexArays可以返回多个ID当需要产生多个VAO时,如10个,需定义一个数组接受函数返回值
    /*
    unsigned int VAO[10];
    glGenVertexArrays(10,AVO); //数组名就是数组的首地址
     
    */
    glBindVertexArray(VAO);

5.造一个VBO绑到VAO的造一个VBO绑定到VAO的GL_ARRAY_BUFFER上上

类似VAO,创建VBO使用函数glGenBuffers

	//造一个VBO绑定到VAO中的GL_ARRAY_BUFFER上
	unsigned int VBO;
	glGenBuffers(1, &VBO);//同上
	glBindBuffer(GL_ARRAY_BUFFER, VBO);//两个参数,第一个是绑去哪里,第二个是要绑定的VBO的id

6.将顶点塞到VBO中

使用glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);

方法,完成数据从CPU到GPU

glBufferData是一个专门用来把用户定义的数据复制到当前绑定缓冲的函数

四个参数:

第一个参数表示要填充的缓冲类型

第二个参数具体指明了缓冲的数据有多少(单位是字节)

第三个参数是具体要发送的数组

第四个参数指明显卡如何处理刚才发送的数组,他有三种形式:

 

  • GL_STATIC_DRAW :数据不会或几乎不会改变。
  • GL_DYNAMIC_DRAW:数据会被改变很多。
  • GL_STREAM_DRAW :数据每次绘制时都会改变。

 

7.到此步骤黑色的部分完成,但是还不能显示,因为还没有写shader(着色器)

8.Vertex shader 

暂时将教材中的代码硬编码为一个字符数组

将代码贴到notepad++中,减少行数,不然看起来很乱,然后在每一行后面加\n,按alt键复选行可以全部添加

然后在每一行的开始和结尾都加上"

最后加上;

把这段代码复制到源程序的顶部 赋值给一个变量 const char* vertexShader 

//顶点着色器
const char* vertexShaderSource =
"#version 330 core                           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值