您的位置:首页 > 运维架构

Opengl备忘2--绘制三角形

2016-04-15 22:45 260 查看
1. Opengl中任何物体都是在3D空间中,而屏幕和窗口是2D,所以需要将3D坐标转为适用屏幕的2D像素

大概是如下一个管线(Pipeline)



2.

三角形顶点:

GLfloat
vertices[] = { -0.5f,
-0.5f,0.0f,0.5f,
-0.5f,0.0f,0.0f,0.5f,0.0f};

VBO:顶点缓冲对象,会在GPU内存中存储大量顶点,使用的好处是可以一次性发送一大批数据到显卡上,

GLuint
VBO;

glGenBuffers(1,
&VBO);

glBindBuffer(GL_ARRAY_BUFFER,
VBO);

glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),
vertices, GL_STATIC_DRAW);// 将数据复制到缓冲内存中



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

数据存储方式:xyzxyzxyzxyz 每个位置xyz
glVertexAttribPointer(0,3,
GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat),
(GLvoid*)0);
glEnableVertexAttribArray(0);

关于glVertexAttribPointer()
---第一个参数指定我们要配置哪一个顶点属性。我们在顶点着色器中使用
layout(location
= 0)
定义了顶点属性——位置(Position)的位置值(Location)。这样要把顶点属性的位置值(Location)设置为0,因为我们希望把数据传递到这个顶点属性中,所以我们在这里填0。
在2.0中,一般通过glGetAttriblocation(),获得位置,大多也是0
----第二个参数指定顶点属性的大小。顶点属性是
vec3
类型,它由3个数值组成。
----第三个参数指定数据的类型,这里是
GL_FLOAT
(GLSL中
vec*
是由浮点数组成的)。
----下个参数定义我们是否希望数据被标准化。如果我们设置为
GL_TRUE
,所有数据都会被映射到0(对于有符号型signed数据是-1)到1之间。我们把它设置为
GL_FALSE

----第五个参数叫做步长(Stride),它告诉我们在连续的顶点属性之间间隔有多少。由于下个位置数据在3个
GLfloat
后面的位置,我们把步长设置为
3
* sizeof(GLfloat)
。要注意的是由于我们知道这个数组是紧密排列的(在两个顶点属性之间没有空隙)我们也可以设置为0来让OpenGL决定具体步长是多少(只有当数值是紧密排列时才可用)。每当我们有更多的顶点属性,我们就必须小心地定义每个顶点属性之间的空间(这个参数的意思简单说就是从这个属性第二次出现的地方到整个数组0位置之间有多少字节)。
-----最后一个参数有奇怪的
GLvoid*
的强制类型转换。它表示我们的位置数据在缓冲中起始位置的偏移量。由于位置数据是数组的开始,所以这里是0。我们会在后面详细解释这个参数。

使用:

(1)复制顶点数组到缓冲中给opengl使用

glBindBuffer(GL_ARRAY_BUFFER,
VBO);

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

(2)设置顶点属性

glVertexAttribPointer(0,3,
GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat),
(GLvoid*)0);

glEnableVertexAttribArray(0);

(3)使用着色器

glUseProgram(shaderProgram);

//

3.
opengl3.0 支持VAO[顶点数组对象]

一个顶点数组对象储存下面的内容:

调用
glEnableVertexAttribArray
glDisableVertexAttribArray

使用
glVertexAttribPointer
的顶点属性配置。
使用
glVertexAttribPointer
进行的顶点缓冲对象与顶点属性链接。



生成VAO:

GLuint
VAO;glGenVertexArrays(1,
&VAO);

//
..:: 初始化代码 (一次完成 (除非你的物体频繁改变)) :: ..

//
1. 绑定VAO

glBindVertexArray(VAO);

//
2. 把顶点数组复制到缓冲中提供给OpenGL使用

glBindBuffer(GL_ARRAY_BUFFER,
VBO);

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

//
3. 设置顶点属性指针

glVertexAttribPointer(0,3,
GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat),
(GLvoid * )0);

glEnableVertexAttribArray(0);

//4.
解绑VAO

glBindVertexArray(0);

[...]

//
..:: 绘制代码 (in Game loop) :: ..

//
5. 绘制物体

glUseProgram(shaderProgram);

glBindVertexArray(VAO);

glDrawArrays(GL_TRIANGLES,0,3);

glBindVertexArray(0);

4.
IBO或EBO

GLfloat
vertices[] = { 0.5f,0.5f,0.0f,//
右上角0.5f,
-0.5f,0.0f,//
右下角
-0.5f,
-0.5f,0.0f,//
左下角
-0.5f,0.5f,0.0f//
左上角};

GLuint
indices[] = { //
起始于0!0,1,3,//
第一个三角形1,2,3//
第二个三角形};

GLuint
IBO;

glGenBuffers(1,
&IBO);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,
IBO);

glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),
indices, GL_STATIC_DRAW);

//绘制

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,
IBO);

glDrawElements(GL_TRIANGLES,6,
GL_UNSIGNED_INT, 0);



5.线框模式

glPolygonMode(GL_FRONT_AND_BACK,
GL_LINE)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: