如何在OpenGL 4中的着色器中设置gl_Vertex?

4

我阅读了很多有关OpenGL 4与OpenGL 1相比的新概念。我的问题是,在旧版GLSL中,我可以直接使用预定义的gl_Vertex进行顶点着色器计算。但在当前版本4.1中,这已被删除。

有许多关于此的问题,但没有人给出实际上如何使旧的gl_Vertex在着色器中可用的示例。我找到了一些可能性,例如layout(location = 0) in vec3 vertexpos;glBindAttribLocation(shader, 0, "vertexpos");。但是没有地方解释我从哪里获得知识以获取当前顶点位置存储的索引。实际上,我发现这个网站有索引,但它似乎不能与上述代码片段一起使用。

也许有人能够为我们提供一个非常简单的示例,带来一些启示。

1个回答

5
gl_Vertex不再可用的原因是因为预定义属性被移除了。曾经是 glVertexPointer 的东西现在必须手动设置为用户定义的命名属性,使用 glVertexAttribPointer 来完成。着色器无法知道哪个数据对应哪个属性,因为它只是数字;然而,如何处理这些数字取决于程序员。
所以,您必须定义至少一个属性(例如您的示例中的vertexpos,但名称几乎可以是任何东西),获取属性位置(使用glGetAttribLocation或使用location指定符来分配默认位置)以将符号名称转换为属性插槽号,然后使用glVertexAttribPointer分配属性数组。

好的,假设在我的着色器中有这一行代码:layout (location = 0) in vec3 vertexpos;。我没有找到一个名为glAttribPointer的函数。我猜你是指glVertexAttribPointer。所以我会用glVertexAttribPointer(0,3,GL_FLOAT,0,0)来调用它。但是哪里有信息说明这个属性vertexpos将存储哪些值?系统从哪里知道我想要在vertexpos中使用gl_Vertex而不是gl_FragColor?也许我只是误解了这些属性背后的概念。 - Flupp
它不知道任何未明确说明的内容。您必须告诉数据来自哪里。在您的示例中,attrib指针的最新参数为0-它直接从顶点缓冲对象的开头开始。当然,在指针声明时必须绑定VBO,并填充所需数据。如果您已经有了使用gl_Vertex的工作程序,则只需要用glVertexAttribPointer替换glVertexPointer(此函数在GL 4中已删除)(感谢更正,我的记忆使我困惑,我最初使用了错误的名称)。 - keltar
谢谢,我想我解决了,但还有一些问题。也许我应该为此开一个新的问题。 - Flupp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接