关于 learnOpenGL 演示中 'glVertexAttribPointer' 的最后一个参数"指针"的问题



我读了两个关于"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:有什么区别?

相关内容

  • 没有找到相关文章

最新更新