您粘貼的三行指定完全不同的東西。
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驅動程序在幕後分配。