在GLES2中使用VBO和VAO对象,已经简单vs,ps绘制一个三角形。

1. 初始化操作代码,创建VBO、VAO,编译和链接shader program。

void DebugApplication::TestCreateVBO()
{
//顶点shader
const GLchar* vertexShaderSrc = "#version 100\n"
"attribute vec4 a_position; \n" // 输入顶点属性,从外部传入
"void main()\n"
"{\n"
"gl_Position = vec4(a_position.x, a_position.y, a_position.z, 1.0);\n"
"}\n\0"; //片段shader
const GLchar* fragmentShaderSrc = "#version 100\n"
"void main()\n"
"{\n"
"gl_FragColor = vec4(1.0,0.5,0.5,1.0);\n" //随意指定一个输出颜色
"}\n\0"; //创建一个vertex shader
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, , &vertexShaderSrc, NULL); //指定shader代码
glCompileShader(vertexShader); //编译shader //检查是否编译成功
GLint status;
GLchar szInfo[];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &status);
if (status != )
{
GLint realSize;
glGetShaderInfoLog(vertexShader, , &realSize, szInfo);
std::cout << " Vertex Shader Error : " << szInfo << std::endl;
glDeleteShader(vertexShader);
return;
} //创建片段shader
GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragShader, , &fragmentShaderSrc, NULL);
glCompileShader(fragShader); //检查是否编译成功
glGetShaderiv(fragShader, GL_COMPILE_STATUS, &status);
if (status != )
{
GLint realSize;
glGetShaderInfoLog(fragShader, , &realSize, &szInfo[]);
std::cout << " Fragment Shader Error : " << szInfo << std::endl;
glDeleteShader(vertexShader);
glDeleteShader(fragShader);
return;
} //链接Shader到Program
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragShader);
glLinkProgram(shaderProgram);
//检查是否有链接错误
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &status);
if (!status)
{
GLint realSize;
glGetShaderInfoLog(shaderProgram, , &realSize, &szInfo[]);
std::cout << "Programe Link Error : " << szInfo << std::endl;
glDeleteShader(vertexShader);
glDeleteShader(fragShader);
glDeleteProgram(shaderProgram);
return;
}
m_shader = shaderProgram; //设置顶点缓存
GLfloat vertices[] = {
-0.5f,-0.5f, .f,
0.5f, -0.5f, .f,
, 0.5f, .f
};
//创建vbo vao
GLuint VBO, VAO;
glGenBuffers(, &VBO);
glGenVertexArrays(, &VAO); //绑定VAO对象
glBindVertexArray(VAO);
//复制顶点数组到顶点缓冲区中
glBindBuffer(GL_ARRAY_BUFFER,VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); //获取vertex attribute "a_position"的入口点
GLuint location = glGetAttribLocation(shaderProgram, "a_position");
glEnableVertexAttribArray(location); //设置顶点属性指针,传递数据vertex shader的位置0,
glVertexAttribPointer(location, , GL_FLOAT, GL_FALSE, sizeof(float) * , (GLvoid*));
glBindBuffer(GL_ARRAY_BUFFER, );
//解绑
glBindVertexArray(); m_vao = VAO; glDeleteShader(vertexShader);
glDeleteShader(fragShader);
}

2. 使用之前创建好的VAO 和 shader program 在每帧绘制一个带颜色的三角形。

    void DebugApplication::TestDrawVBO()
{
//使用shader 绑定vao对象进行绘制
glUseProgram(m_shader);
glBindVertexArray(m_vao);
glDrawArrays(GL_TRIANGLES, , );
glBindVertexArray();
}

GLES2学习VBO和VAO的使用的更多相关文章

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

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

  2. OpenGL图形渲染管线、VBO、VAO、EBO概念及用例

    图形渲染管线(Pipeline) 图形渲染管线指的是对一些原始数据经过一系列的处理变换并最终把这些数据输出到屏幕上的整个过程. 图形渲染管线的整个处理流程可以被划分为几个阶段,上一个阶段的输出数据作为 ...

  3. [转]OpenGL图形渲染管线、VBO、VAO、EBO概念及用例

    直接给出原文链接吧 1.OpenGL图形渲染管线.VBO.VAO.EBO概念及用例 2.OpenGL中glVertex.显示列表(glCallList).顶点数组(Vertex array).VBO及 ...

  4. VBO、VAO和EBO

    Vertex Buffer Object 对于经历过fixed pipeline的我来讲,VBO的出现对于渲染性能提升让人记忆深刻.完了,暴露年龄了~ //immediate mode glBegin ...

  5. Opengl ES之VBO和VAO

    前言 本文主要介绍了什么是VBO/VAO,为什么需要使用VBO/VAO以及如何使用VBO和VAO. VBO 什么是VBO VBO(vertex Buffer Object):顶点缓冲对象.是在显卡存储 ...

  6. openGL 提升渲染性能 之 顶点数组 VBO IBO VAO

    使用openGL图形库绘制,都需要通过openGL接口向图像显卡提交顶点数据,显卡根据提交的数据绘制出相应的图形. openGL绘制方式有:直接模式,显示列表,顶点数组,顶点索引. 直接模式:最简单, ...

  7. 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形 【转】

    http://blog.csdn.net/xiajun07061225/article/details/7628146 以前都是用Cg的,现在改用GLSL,又要重新学,不过两种语言很多都是相通的. 下 ...

  8. VBO与VAO 【转】

    我想大家都已经熟悉VBO了吧.在GL3.0时代的VBO大体还是处于最重要的地位,但是与此同时也出现了不少新的用法和辅助役,其中一个就是VAO.本文大致小记一下这两者的联系,帮助大家理解一下这个角色.— ...

  9. OpenGL渲染管道,Shader,VAO&VBO&EBO

    OpenGL渲染管线 (也就是)OpenGL渲染一帧图形的流程 以下列举最简单的,渲染一个三角形的流程,你可以将它视为 精简版OpenGL渲染管线 更复杂的流程也仅仅就是:在此基础上的各个流程中 添加 ...

随机推荐

  1. Caused by: java.lang.ClassNotFoundException: org.aspectj.lang.annotation.Around

    1.错误描述 INFO:2015-05-01 11:12:15[localhost-startStop-1] - Root WebApplicationContext: initialization ...

  2. UltraEdit 脚本 实现查找替换

    UltraEdit中,要实现,脚本查找替换功能,按照下文中的做法稍作修改, 现象很奇怪,有时可以进行查找替换有时不能. http://blog.csdn.net/neareast/article/de ...

  3. ubuntu安装latex

    1 终端中输入"sudo apt-get install texlive-full",输入root密码. 若不想安装所有文件,可以选择"sudo apt-get inst ...

  4. JDK1.5-1.7的特性

    JDK1.5新特性: 1.自动装箱与拆箱 2.枚举(常用来设计单例模式) 3.静态导入  (import static java.lang.Math.*;) 4.可变参数 eg: public sta ...

  5. 【小白学爬虫连载(10)】–如何用Python实现模拟登陆网站

    Python如何实现模拟登陆爬取Python实现模拟登陆的方式简单来说有三种:一.采用post请求提交表单的方式实现.二.利用浏览器登陆网站记录登陆成功后的cookies,采用get的请求方式,传入c ...

  6. 建立简单的Hash table(哈希表)by C language

    #define SIZE 1000 //定义Hash table的初始大小 struct HashArray { int key; int count; struct HashArray* next; ...

  7. UML类图二

    在软件系统中,类并不是孤立存在的,类与类之间存在各种关系,对于不同类型的关系,UML提供了不同的表示方式.       1. 关联关系 关联(Association)关系是类与类之间最常用的一种关系, ...

  8. 数据库连接问题之:Caused by: java.sql.SQLException: Connections could not be acquired from the underlying database!

    要么是驱动问题(没加载到工程中去或者其他问题)要么是账号密码或者url或者driver写错 driver:com.mysql.jdbc.Driver url:jdbc:mysql://localhos ...

  9. 记录解决python在spark运行加载第三方库的问题

    一般写python的我们经常会import一些常用的库,然后有时集群环境上的python没有这些库,怎么办呢? 通过一段时间的摸索发现有二种方式可以解决这个问题: 第一种方法: 下载对应python的 ...

  10. C#判断某个类是否派生某个类或是否实现了某个接口

    is和as is关键字可以确定对象实例或表达式结果是否可转换为指定类型.基本语法: expr is type 如果满足以下条件,则 is 语句为 true: expr 是与 type 具有相同类型的一 ...