我读了两个关于"OpenGL入门"的演示
-
谷歌安卓hello-gl2
gl_code.cpp -
learnopengl.com你好三角
Hello_Triangle.cpp
对于glVertexAttribPointer
的最后一个参数:
google android demo:使用数组名称gTriangleVertices
learnOpenGL.com demo:使用0
。
谷歌安卓演示:
glUseProgram(gProgram);
checkGlError("glUseProgram");
glVertexAttribPointer(gvPositionHandle, 2,
GL_FLOAT, GL_FALSE, 0,
gTriangleVertices); // array name
checkGlError("glVertexAttribPointer");
glEnableVertexAttribArray(gvPositionHandle);
learnOpenGL.com代码段:
// set up vertex data (and buffer(s)) and configure vertex attributes
// ------------------------------------------------------------------
float vertices[] = {
-0.5f, -0.5f, 0.0f, // left
0.5f, -0.5f, 0.0f, // right
0.0f, 0.5f, 0.0f // top
};
unsigned int VBO, VAO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
// bind the Vertex Array Object first, then bind and set vertex buffer(s), and then configure vertex attributes(s).
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3,
GL_FLOAT, GL_FALSE,
3 * sizeof(float),
(void*)0); // my question : `0`
glEnableVertexAttribArray(0);
// note that this is allowed, the call to glVertexAttribPointer registered VBO as the vertex attribute's bound vertex buffer object so afterwards we can safely unbind
glBindBuffer(GL_ARRAY_BUFFER, 0);
// You can unbind the VAO afterwards so other VAO calls won't accidentally modify this VAO, but this rarely happens. Modifying other
// VAOs requires a call to glBindVertexArray anyways so we generally don't unbind VAOs (nor VBOs) when it's not directly necessary.
glBindVertexArray(0);
点击:代码比较屏幕截图
我倾向于认为learnOpenGL的演示是错误的,
但learnOpenGL是一个著名的网站,不可能出错
最后,两个演示都可以正确显示三角形。
我很困惑。
我很困惑什么时候通过0
,什么时候通过pointer value
?
由于兼容性的原因,glVertexAttribPointer
的最后一个参数的类型为const void *
。
如果非零命名缓冲区对象绑定到GL_ARRAY_BUFFER
目标,则最后一个参数(指针(被视为缓冲区对象数据存储的字节偏移:
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(float), (void*)0);
在传统OpenGL(兼容性配置文件OpenGL上下文(中,可以直接指定数据指针(在这种情况下,它不能绑定到缓冲区对象,因为指针不应被视为缓冲区中的字节偏移(:
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(float), gTriangleVertices);
然而,还有更多。请参阅glVertexAttribPointer和glVertexAttribFormat:有什么区别?