2014-07-06 102 views
1

什麼時候應該使用以下每種方法在glsl中接收數據?GLSL屬性類型/版本迷茫

layout(points) in; 
in vec3 pos; 
uniform float x; 

據我所知,「in」意味着它是一個屬性,而不是一個統一體。制服在所有着色器中都可用,而爲此特定着色器定義一個屬性。此外,制服通過glUniformTYPE傳遞,而屬性(我不知道這一點)必須通過緩衝區傳遞。

我試圖避免在像glMatrix等功能的內置opengl的內置,因爲教程建議這基本上是depricated /舊風格。那是對的嗎?如果是這樣,我如何將索引分配給緩衝區?

回答

3

您粘貼的三行指定完全不同的東西。

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驅動程序在幕後分配。