c_cpp 使用VAO(顶点数组对象)和顶点缓冲区定义和绘制矩形。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 使用VAO(顶点数组对象)和顶点缓冲区定义和绘制矩形。相关的知识,希望对你有一定的参考价值。
/* Example class for rendering a rectangle using OpenGL 4, using a vertex buffer and a
* vertex array object and the triangle strip primitive.
*
* Note: GL calls are wrapped into a variadic macro of the form GL(func, arg1, arg2,...).
*/
class opengl_rectangle {
public:
void get_resources()
{
// Generate a vertex buffer
GL(GenBuffers, 1, &vertex_buffer);
// Define a VAO (Vertex Array Object)
GL(GenVertexArrays, 1, &vao);
GL(BindVertexArray, vao);
// Vertex buffer
GL(BindBuffer, GL_ARRAY_BUFFER, vertex_buffer);
// Example vertex layout: vec4 vertex coordinates, vec2 texture coordinates
// Vertex attrib 0: vertex coordinates
GL(VertexAttribPointer, 0, 4, GL_FLOAT, GL_FALSE, sizeof(vertex_data), (const GLvoid *)0);
GL(EnableVertexAttribArray, 0);
// Vertex attrib 1: texture coordinates
GL(VertexAttribPointer, 1, 2, GL_FLOAT, GL_FALSE, sizeof(vertex_data), (const GLvoid *)(4 * sizeof(GLfloat)));
GL(EnableVertexAttribArray, 1);
// Done
GL(BindVertexArray, 0);
}
void free_resources()
{
GL(DeleteVertexArrays, 1, &vao); vao = 0;
GL(DeleteBuffers, 1, &vertex_buffer); vertex_buffer = 0;
}
void set_bounds(GLfloat w, GLfloat h, GLfloat x = -1, GLfloat y = -1)
{
vertex_data vertices[4] = {
// Example vertex layout: vec4 (x,y,z,w) vertex coordinates,
// vec2(u,v) texture coordinates
{ { x , y , 0, 1 }, { 0, 0 } },
{ { x + w, y , 0, 1 }, { 1, 0 } },
{ { x , y + h, 0, 1 }, { 0, 1 } },
{ { x + w, y + h, 0, 1 }, { 1, 1 } }
};
GL(BindBuffer, GL_ARRAY_BUFFER, vertex_buffer);
GL(BufferData, GL_ARRAY_BUFFER, 4 * sizeof(vertex_data), vertices, GL_STATIC_DRAW);
GL(BindBuffer, GL_ARRAY_BUFFER, 0);
}
/** glUseProgram() and glBindTexture() must be called before calling draw().
*/
void draw()
{
GL(BindVertexArray, vao);
GL(DrawArrays, GL_TRIANGLE_STRIP, 0, 4);
GL(BindVertexArray, 0);
}
private:
GLuint vao;
GLuint vertex_buffer;
};
以上是关于c_cpp 使用VAO(顶点数组对象)和顶点缓冲区定义和绘制矩形。的主要内容,如果未能解决你的问题,请参考以下文章
OpenGL 顶点数组/缓冲区对象
绑定到“顶点数组对象”后,我应该删除“顶点缓冲区对象”吗?
OpenGL 顶点数组对象是存储顶点缓冲区名称和索引,还是只存储索引?
在两个不同的顶点数组对象中使用顶点缓冲区
初识OpenGL (-)VAO顶点数组对象
初识OpenGL (-)VAO顶点数组对象