您粘贴的三行指定完全不同的东西。
layout(points) in;
这看起来像从用于几何着色器阶段的输入鉴定。它声明这个几何着色器得到GL_POINTS
作为输入基元类型(即你必须绘制GL_POINTS
)。它通常后跟一个类似的声明的那种原语,然后从几何着色器输出的,例如
layout(triangle_strip, max_vertices=3) out; // drawing triangles
in vec3 pos;
这不是声明的一个通用的“输入”这种着色阶段,键入vec3。取决于实际的着色器阶段,其含义可能不同。例如,在顶点着色器中,这意味着每个顶点属性 - 即每个顶点¹唯一的一组数据。在几何着色器中,您将获得整个图元作为输入。在片段着色器中使用光栅化的值。
在顶点着色器的情况下,每一个顶点处理会得到其自己的“POS”从一个合适的配置的输入阵列,通常从先前已经结合到GL_ARRAY_BUFFER
绑定点和已被配置为一个缓冲区对象²通过呼叫glVertexAttribPointer
向该属性提供数据。
或,它可能是片段着色器的输入。在这种情况下,它是一个per-fragment属性,它在默认情况下(没有额外的限定条件)已经过透视校正插值。举例来说,顶点着色器可以输出为每个顶点颜色:
#version 330
in vec3 position;
in vec3 input_color; // attribute as before
out vec3 color; // output towards the next shader stage
// (potentially) ran once per input vertex
void main() {
gl_Position = vec4(position, 1.0);
color = input_color;
}
和片段着色器可以挑选插颜色:
#version 330
in vec3 color; // automatically "paired" to the VS output, i.e. the previous shader stage
// gets perspective-correct interpolation
out vec4 screenColor; // output => drawn on the screen
// (potentially) ran once per drawn fragment
void main() {
screenColor = vec4(color, 1.0);
}
所以,“在”的含义和“out “取决于他们得到使用的特定着色器阶段。
uniform float x;
这只是表示“x”是整个着色器程序的浮点类型的统一体。它不能在着色器程序中更改;所有着色阶段都会看到它(他们只需要声明它)。
如果是的话,我将如何分配到指标,例如一个缓冲区?
这是什么意思?
有现代OpenGL绘图的教程,这使得这些事情讲清楚,坚持现代化的标准,同时还涵盖了所有的基本知识?
是的,例如http://www.opengl-tutorial.org/。
¹此规则有例外,例如属性除数,但让我们保持简单。
²阅读:你应该做什么。您可以避免使用缓冲区并直接指定顶点属性值,但很可能发生的情况是缓冲区将由GL驱动程序在幕后分配。