我试图实现现代OpenGL,但问题是:大多数教程都基于3.3+,并且谈论GLSL 330,我只有GLSL 130.因此,很多事情显然不同,因为我的VBO不起作用。
你能给我一般提示或教程解释如何在VBO中使用GLSL 130吗?在我的情况下,我加载了vbo,但是当我使用我的着色器程序时,只有使用glVertex调用的顶点被渲染,就像vbo被忽略(没有输入)。怎么解决这个问题?
你可以在没有着色器的情况下使用VBO吗?我试着这样做,但它崩溃了......
答案 0 :(得分:3)
是的,VBO仍然可以在GLSL 130中使用,即使没有着色器也可以使用。 VBO的目的是保存绘图的顶点属性。我见过的大多数最新教程都使用布局位置说明符来指示如何在着色器中处理不同的属性,即
layout(location = 0) in vec3 Position;
GLSL 130不支持此功能,因此您必须使用另一种方法将属性与VBO相关联。这非常简单......您可以使用glBindAttribLocation
或glGetAttribLocation
。调用glGetAttribLocation
将为您提供在glVertexAttribPointer
中使用的标识符,以将VBO数据与特定属性相关联。您可以在编译程序后随时调用它。此外,如果在创建程序对象之后但在链接着色器之前调用它,则可以调用glBindAttribLocation来专门设置与给定属性名称关联的标识符。这很方便,因为它可以让您自己决定位置应该是什么,就像您可以使用布局说明符一样。
最后,如果你想在不使用着色器的情况下使用VBO,那么你仍然需要找到一种方法来将VBO中的数据与固定功能管道所期望的各种输入相关联。这是使用名为glEnableClientState()
和glVertexPointer()
的现已弃用的方法完成的,它们一起让您告诉OpenGL您要填充的固定函数管道属性,以及它如何在VBO中查找数据。