在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. SecurityError:Error #2048:安全沙箱冲突

    1.错误描述 SecurityError:Error #2048:安全沙箱冲突:http://localhost:8080/YHD/flash/YHD.swf 不能从 http://123.89.45 ...

  2. Java和Flex整合报错(五)

    1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...

  3. Openstack_O版(otaka)部署_镜像服务glance部署

    安装和配置服务 1. 建库建用户 mysql -u root -p CREATE DATABASE glance; GRANT ALL PRIVILEGES ON glance.* TO '; GRA ...

  4. 石子归并 51Nod - 1021

    N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价.计算将N堆石子合并成一堆的最小代价.   例如: 1 2 3 4,有 ...

  5. jsonp的案例

    一,转发一 首先基于安全的原因,浏览器是存在同源策略这个机制的,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性.看起来不知道什么意思,实践一下就知道了. 1.随便建两个网页 一 ...

  6. Java冒泡排序法升级版

    /*  * 冒泡排序之升级版,可比较整型数组.小数型数组  *   * */ public static <T extends Comparable<T>> void Bubb ...

  7. [SPOJ]DISUBSTR:Distinct Substrings&[SPOJ]SUBST1:New Distinct Substrings

    题面 Vjudge Vjudge Sol 求一个串不同子串的个数 每个子串一定是某个后缀的前缀,也就是求所有后缀不同前缀的个数 每来一个后缀\(suf(i)\)就会有,\(len-sa[i]+1\)的 ...

  8. mininet中加载ECN

    今天捣鼓了一上午,中午把ECN部署到mininet中了,简单记录下加载过程: 加载前搜索了全网,找到了一个有用的参考网页:https://groups.google.com/a/openflowhub ...

  9. 号称了解mesos双层调度的你,先来回答下面这五个问题!

    一提mesos,很多人知道双层调度,但是大多数理解都在表面,不然试一下下面五个问题. 问题一:如果有两个framework,一万个节点,按说应该平均分配给两个framework,怎么个分法?一人一台这 ...

  10. SpringBoot初探之Swagger配置

    Swagger是一个用于描述和测试restful接口的工具,只要在定义restful接口时增加一些类和方法的描述注解,通过很简单的配置就可以得到一个展示接口定义页面,也可以在页面上设置参数提交测试接口 ...