【问题标题】:Layout Qualifiers in Open GLES 3.0Open GLES 3.0 中的布局限定符
【发布时间】:2017-05-07 04:15:50
【问题描述】:

我正在 Swift Playground 中尝试使用 Open GLES 3.0 API(以及随附的核心 330 GLSL 着色器语言)。我的顶点着色器顶部有以下声明:

layout(location = 0) in vec4 a_Position;

我对布局限定符的理解是指定a_Position 在顶点缓冲区对象的属性索引中的位置。 (松散,因为我对 VAO 的理解是......)。

但除非我还包含以下代码,否则我的三角形不会呈现:

glEnableVertexAttribArray(0)
glVertexAttribPointer(
        0,
        3,
        GLenum(GL_FLOAT),
        GLboolean(GL_FALSE),
        GLsizei(MemoryLayout<Vertex>.size),
        BUFFER_OFFSET(0))

但是我对布局限定符的理解会告诉我这不是必需的,因为它已经指定了a_Position 在顶点属性数组中的位置。 (在索引 0 处)。

所以要么我遗漏了一些小细节,要么我对如何在 GPU 上的着色器中访问 VAO 数据的理解存在缺陷。可能两者兼而有之。那么为什么带有布局限定符的着色器声明不足以让我的顶点位置进入a_Position

【问题讨论】:

    标签: graphics opengl-es glsl opengl-es-2.0 swift-playground


    【解决方案1】:

    layout(location=0) 表示您不必调用glGetVertexAttribLocation 来获取glEnableVertexAttribArrayglVertexAttribPointer 调用的属性索引。这些电话仍然是必要的。

    Shader 声明是不够的,因为您仍然需要提供 glVertexAttribPointer 的参数中的信息,例如规范化、数据类型等。

    【讨论】:

    • 所以您仍然需要启用调用? (不确定这是什么启用..)并且您需要输入glVertexAttribPointer 参数信息,因为着色器变量如何知道大小/步幅/类型信息对吗?我想知道如何简单地在布局限定中指定一个索引就足够了。但基本上,如果你说layout(location = 1),你可以可靠地启用索引 1 并为索引 1 设置属性指针信息?
    • @AlexBollbach 如果未启用属性 (glEnableVertexAttribArray),则不会在渲染期间使用该属性。是的,layout(location=1) 意味着您可以可靠地将glVertexAttribPointer 中的索引设置为 1。
    猜你喜欢
    • 2017-10-05
    • 1970-01-01
    • 2015-09-09
    • 2023-03-28
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多