【问题标题】:OpenGL: layout qualifier?OpenGL:布局限定符?
【发布时间】:2015-11-03 07:36:13
【问题描述】:

所以我一直在学习一些 OpenGL,需要学习的内容很多,我只是一个初学者,但我不了解 GLSL 中的“布局限定符”。

所以是这样的:

layout (location = 0) in vec3 position;

在一个简单的顶点着色器中,例如:

#version 330 core
layout (location = 0) in vec3 position; // The position variable has attribute position 0

out vec4 vertexColor; // Specify a color output to the fragment shader

void main()
{
    gl_Position = vec4(position, 1.0); // See how we directly give a vec3 to vec4's constructor
    vertexColor = vec4(0.5f, 0.0f, 0.0f, 1.0f); // Set the output variable to a dark-red color
}

例如,我了解 out vec4(因为那是进入片段着色器)。例如,vertexColor 是有意义的。

但也许我不理解“位置”以及在这个意义上这究竟意味着什么?有人愿意解释吗? opengl wiki 老实说并没有帮助我。

但也许我误解了什么是顶点着色器(我当然还是有点不确定管道)。但据我了解,顶点规范是我们做正确的第一件事吗? (顶点/索引,如果需要)并将它们存储到 VAO 中。

所以顶点着色器与每个单独的顶点交互? (我希望)因为我就是这么理解的?

【问题讨论】:

    标签: opengl glsl


    【解决方案1】:

    你是对的,顶点着色器是针对每个顶点执行的。

    一个顶点由一个或多个属性(位置、法线、纹理坐标等)组成。

    在 CPU 端,当你创建你的 VAO 时,你通过说“这个缓冲区中的这个数据将是属性 0,它旁边的数据将是属性 1 等等”来描述每个属性。请注意,VAO 仅存储关于 where's who 的信息。实际的顶点数据存储在 VBO 中。

    在顶点着色器中,带有布局和位置的那行只是说“获取属性0并将其放入一个名为位置的变量中”(location表示属性的编号)。

    如果这两个步骤都正确完成,你应该在名为 position 的变量中得到一个位置 :) 是不是更清楚了?

    【讨论】:

    • 那么你为什么要使用除零之外的任何东西?
    • 例如,如果你有位置和法线,你可以在属性 0 中定位,在属性 1 中定位法线。你不能将两者都放在属性 0 中。
    • 嗯,有道理,或者属性 0 中的位置,1 中的颜色或类似的东西。
    • 您是否必须在您的 opengl 中设置这些位置,如果需要,如何设置?
    猜你喜欢
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    相关资源
    最近更新 更多