GLES2学习VBO和VAO的使用
在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的使用的更多相关文章
- OpenGL中glVertex、显示列表(glCallList)、顶点数组(Vertex array)、VBO及VAO区别
OpenGL中glVertex.显示列表(glCallList).顶点数组(Vertex array).VBO及VAO区别 1.glVertex 最原始的设置顶点方法,在glBegin和glEnd之间 ...
- OpenGL图形渲染管线、VBO、VAO、EBO概念及用例
图形渲染管线(Pipeline) 图形渲染管线指的是对一些原始数据经过一系列的处理变换并最终把这些数据输出到屏幕上的整个过程. 图形渲染管线的整个处理流程可以被划分为几个阶段,上一个阶段的输出数据作为 ...
- [转]OpenGL图形渲染管线、VBO、VAO、EBO概念及用例
直接给出原文链接吧 1.OpenGL图形渲染管线.VBO.VAO.EBO概念及用例 2.OpenGL中glVertex.显示列表(glCallList).顶点数组(Vertex array).VBO及 ...
- VBO、VAO和EBO
Vertex Buffer Object 对于经历过fixed pipeline的我来讲,VBO的出现对于渲染性能提升让人记忆深刻.完了,暴露年龄了~ //immediate mode glBegin ...
- Opengl ES之VBO和VAO
前言 本文主要介绍了什么是VBO/VAO,为什么需要使用VBO/VAO以及如何使用VBO和VAO. VBO 什么是VBO VBO(vertex Buffer Object):顶点缓冲对象.是在显卡存储 ...
- openGL 提升渲染性能 之 顶点数组 VBO IBO VAO
使用openGL图形库绘制,都需要通过openGL接口向图像显卡提交顶点数据,显卡根据提交的数据绘制出相应的图形. openGL绘制方式有:直接模式,显示列表,顶点数组,顶点索引. 直接模式:最简单, ...
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形 【转】
http://blog.csdn.net/xiajun07061225/article/details/7628146 以前都是用Cg的,现在改用GLSL,又要重新学,不过两种语言很多都是相通的. 下 ...
- VBO与VAO 【转】
我想大家都已经熟悉VBO了吧.在GL3.0时代的VBO大体还是处于最重要的地位,但是与此同时也出现了不少新的用法和辅助役,其中一个就是VAO.本文大致小记一下这两者的联系,帮助大家理解一下这个角色.— ...
- OpenGL渲染管道,Shader,VAO&VBO&EBO
OpenGL渲染管线 (也就是)OpenGL渲染一帧图形的流程 以下列举最简单的,渲染一个三角形的流程,你可以将它视为 精简版OpenGL渲染管线 更复杂的流程也仅仅就是:在此基础上的各个流程中 添加 ...
随机推荐
- (三十一)java多线程二
因为线程在执行的过程中具有一定的不确定性,在并发的时候就会出现安全问题,因此一般需要采取一定的措施来保证线程的安全,同步代码块就是其中一种方式. 以下是模拟银行取钱的多线程小例子,两个都能确保安全,但 ...
- Error #2044: 未处理的 ioError:。 text=Error #2032
1.错误描述 Error #2044: 未处理的 ioError:. text=Error #2032: 流错误. URL: http://127.0.0.1:8080/HBMB/analysis/a ...
- Flex动态获取方法报错
1.错误描述 2.错误原因 由于Flex文件修改后,需要将其编译成swf文件,刚修改的方法没有编译,再加上历史缓存的原因,导致报错 3.解决办法 将Flex项目重新clean一下,并将MyEclips ...
- FFMPEG:压缩之H264编码(YUV420P->H264)
720*576@25hz,550帧的yuv420p数据,编码时间13.3秒. void CTest0Dlg::OnButton5() { // TODO: Add your control notif ...
- 芝麻软件: Python爬虫进阶之爬虫框架概述
综述 爬虫入门之后,我们有两条路可以走. 一个是继续深入学习,以及关于设计模式的一些知识,强化Python相关知识,自己动手造轮子,继续为自己的爬虫增加分布式,多线程等功能扩展.另一条路便是学习一些优 ...
- 决策树系列(五)——CART
CART,又名分类回归树,是在ID3的基础上进行优化的决策树,学习CART记住以下几个关键点: (1)CART既能是分类树,又能是分类树: (2)当CART是分类树时,采用GINI值作为节点分裂的依据 ...
- UltraEdit 脚本 实现查找替换
UltraEdit中,要实现,脚本查找替换功能,按照下文中的做法稍作修改, 现象很奇怪,有时可以进行查找替换有时不能. http://blog.csdn.net/neareast/article/de ...
- 过滤文件代码 python
import os import cv2 import shutil # store all file in directory global totalFileList totalFileList ...
- Postman教程——创建第一个集合
系列文章首发平台为果冻想个人博客.果冻想,是一个原创技术文章分享网站.在这里果冻会分享他的技术心得,技术得失,技术人生.我在果冻想等待你,也希望你能和我分享你的技术得与失,期待. 什么是集合 集合是P ...
- mysql 服务启动失败
mysql 数据库连接失败 1.用naviCat Preiumn 连接本地的mysql 失败,查找原因,mysql 数据库服务没有启用,但是在服务列表里面没有找到对应的mysql 服务. 所以在cmd ...