您粘贴的三行指定了完全不同的内容。
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 调用向该属性提供数据。
OR,它可以是片段着色器的输入。在这种情况下,它是每个片段的属性,它(在没有额外条件的默认情况下)已经过透视校正插值。例如,顶点着色器可以为每个顶点输出一种颜色:
#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);
}
因此,“in”和“out”的含义取决于它们所使用的特定着色器阶段。
uniform float x;
这只是意味着“x”是整个着色器程序的浮点类型的统一。它不能从着色器程序中更改;所有着色器阶段都会看到它(他们只需要声明它)。
如果是这样,例如,我将如何将索引分配给缓冲区?
这是什么意思?
是否有关于现代 opengl 绘图的教程,它使这些事情变得清晰并坚持现代标准,同时还涵盖了所有基础知识?
是的,例如http://www.opengl-tutorial.org/。
¹这条规则有一些例外,例如属性除数,但让我们保持简单。
² 阅读:你应该做什么。您可以避免使用缓冲区并直接指定顶点属性值,但很可能发生的情况是 GL 驱动程序会在后台分配缓冲区。