我是OpenGL的新手。 我知道如何创建顶点和片段着色器以及如何创建顶点数组并将它们放在缓冲区上,但我如何链接这两个? 含义 - 当我运行我的程序时,它如何知道当前活动缓冲区上的顶点数组应该“馈送”到顶点着色器?
这是通过使用glVertexAttribPointer
吗?
谢谢!
答案 0 :(得分:2)
没有“当前活动的缓冲区”这样的东西。 (嗯,只有在VAO规范时使用非直接状态访问API才有意义。)
顶点数组对象(VAO)将指针(通过glVertexAttribPointer
设置)保存到内存缓冲区中的数据中。与这些缓冲区的绑定是VAO状态的一部分。当您绑定VAO时,后续glDraw*
命令会将绑定到当前VAO的缓冲区中的顶点传输到管道。
为了简化理解,这里是VAO的大致内容,使用相关的OpenGL 4.5直接状态访问函数名来设置该状态:
struct VertexArrayObject
{
// VertexArrayElementBuffer
uint element_buffer;
struct Binding {
// VertexArrayVertexBuffers
uint buffer;
intptr offset;
sizei stride;
// VertexArrayBindingDivisor
uint divisor;
} bindings[];
struct Attrib {
// VertexArrayAttribBinding
uint binding; // This is an index into bindings[]
// EnableVertexArrayAttrib
bool enabled;
// VertexArrayAttrib*Format
int size;
enum type;
boolean normalized;
boolean integer;
boolean long;
uint relativeoffset;
} attribs[];
};
当您致电glVertexAttribPointer
时,它基本上会在当前绑定的VAO上执行以下操作:
vao.attribs[index].binding = index;
vao.attribs[index].size = size;
vao.attribs[index].type = type;
vao.attribs[index].normalized = normalized;
vao.attribs[index].relativeoffset = 0;
vao.bindings[index].buffer = current ARRAY_BUFFER;
vao.bindings[index].offset = pointer;
vao.bindings[index].stride = stride; // if stride == 0 computes based on size and type