在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. 获取对固定列不重复的新DataTable

    获取对固定列不重复的新DataTable  ///<summary> /// 获取对固定列不重复的新DataTable /// </summary> ///<param ...

  2. Flex中TabNavigator隐藏和显示选项卡

    1.问题背景 遇到这样一个问题:有四个Tab选项卡,根据不同的参数隐藏和显示选项卡 2.实现实例 (1)隐藏"春季" protected function springClickH ...

  3. Vue项目搭建及原理三

    我每次写博客都要先在本地写一遍草稿,所以之前有些发布顺序可能会有一丢丢凌乱 哈哈哈,以后绝对改正,那下面我们就说一下创建及项目目录结构吧 三.创建项目 1.初始化Webpack p.p1 { marg ...

  4. OpenStack_I版 7.Cinder部署

    Cinder提供块存储   Cinder安装     创建相关的目录           创建数据库   修改Cinder配置文件       同步数据库   keystone相关配置         ...

  5. 图片压缩上传Thumbnailator 插件

    一,接口已经写死 public static String upload(String appCode, MultipartFile inputFile) public static String u ...

  6. AJAX的简洁写法

    // ajax操作 $('#btn').on('click',function(){ var url = "{:url('confirm')}"; var actual_money ...

  7. SpringBoot集成Shiro并用MongoDB做Session存储

    之前项目鉴权一直使用的Shiro,那是在Spring MVC里面使用的比较多,而且都是用XML来配置,用Shiro来做权限控制相对比较简单而且成熟,而且我一直都把Shiro的session放在mong ...

  8. 洛谷P3203 [HNOI2010]弹飞绵羊(LCT,Splay)

    洛谷题目传送门 关于LCT的问题详见我的LCT总结 思路分析 首先分析一下题意.对于每个弹力装置,有且仅有一个位置可以弹到.把这样的一种关系可以视作边. 然后,每个装置一定会往后弹,这不就代表不存在环 ...

  9. [BZOJ1610] [Usaco2008 Feb] Line连线游戏 (set)

    Description Farmer John最近发明了一个游戏,来考验自命不凡的贝茜.游戏开始的时 候,FJ会给贝茜一块画着N (2 <= N <= 200)个不重合的点的木板,其中第i ...

  10. java 实现登录验证码 (kaptcha 验证码组件)

    验证码的作用: 1.防止广告机注册和发帖.评论.2.防止暴力破解密码,特别是有管理员权限的密码. 在这里介绍一种非常实用的验证码生成工具:kaptcha 这个工具,可以生成各种样式的验证码,因为它是可 ...