glVertexAttribPointer

glVertexAttribPointer的详细用法,参考 http://docs.gl/gl4/glVertexAttribPointer

这篇文章做一下简单的记录:

 

先按照我自己的理解,做一下说明:

attribute:  position, UV坐标,Color等属性。
vertex:     一组 attribute

 

函数声明:

void glVertexAttribPointer(GLuint index,          // typedef unsigned int GLuint;
                GLint size,      // typedef int GLint;
                GLenum type,       // typedef unsigned int GLenum;
                GLboolean normalized, // typedef unsigned char GLboolean;
                GLsizei stride,      // typedef int GLsizei;
                const GLvoid * pointer); // typedef void GLvoid;

index: 对应顶点着色器的 layout(localtion = 0)

size:  attribute 的大小, 例如,GL_BGRA是4。 position(x, y) 是2。

type: 初始值是 GL_FLOAT

normalized: GL_TRUE时保存的数据 int会映射到[-1,1],unsigned int会映射到[0, 1]。(byte好像会映射到[0, 255]) 。 GL_FLOAT时会直接使用float的数据。

stride: 一组vertex的大小(连续的attribute组之间的间隔)

pointer: 这个参数的类型是void*, 要获取数据的偏移(attribute的偏移)。例如 vertex的内容为: position, color,UV. 这个时候如果想获取color, 则需要跳过 position的大小。

 

 

相关的程序代码:

// position,          color,       uv坐标
float
data[] = { -0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f }; unsigned int buffer; glGenBuffers(1, &buffer); glBindBuffer(GL_ARRAY_BUFFER, buffer); glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), positions, GL_STATIC_DRAW);
//position glEnableVertexAttribArray(
0); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 7, 0);

//color
glEnableVertexAttribArray(1);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 7, (GLvoid*) 2 * sizeof(float));

//uv
glEnableVertexAttribArray(1);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 7, (GLvoid*) 5 * sizeof(float));
posted @ 2020-05-20 23:21  HaHahahahaaaa  阅读(1306)  评论(1编辑  收藏  举报