2014-06-25 42 views
8

我目前正在使用着色器(3.3)學習OpenGL。有一件事我似乎無法解決。我讀過使用內置變量如gl_Position和gl_FragCoords在OpenGL 3 +中不推薦使用,因此我想使用自己的輸出變量。GLSL - 使用自定義輸出屬性代替gl_Position

因此,不是這樣的:

#version 330\n 
layout(location=0) in vec2 i_position; 
out vec4 o_position; 
void main() 
{ 
    gl_Position = vec4(i_position, 0.0, 1.0); 
}; 

我寫了這個:

#version 330\n 
layout(location=0) in vec2 i_position; 
out vec4 o_position; 
void main() 
{ 
    o_position = vec4(i_position, 0.0, 1.0); 
}; 

着色器編譯沒有在這兩種情況下的問題,但第二個代碼只產生空白屏幕。我是否需要以某種方式指定哪個變量是輸出變量?

+4

這些[內置變量](http://www.opengl.org/wiki/Built-in_Variable_(GLSL))都不推薦使用。在覈心配置文件(兼容性配置文件)之前,有一些內置函數反映了固定的管道屬性,例如'gl_​​Color','gl_Normal'等。 –

+0

哦,我很抱歉。我讀過一些'gl_ *'變量已被棄用,並認爲它們都是。謝謝你的澄清。無論如何,我如何使它與自定義輸出變量一起工作?或者你只是使用gl_Position屬性來設置頂點位置? – michy04

+2

你必須仍然使用'gl_Position'。該變量是特殊的,因爲它指定了頂點和片段着色器之間由固定功能塊使用的座標(裁剪,光柵化等)。你不能用你定義的變量替換它。除了@BrettHale已經提到的例子之外,'gl_FragColor',它曾經是**片段**着色器的預定義輸出,也被棄用。 –

回答

26

這主要是由評論覆蓋,但爲了有一個適當的答案,讓我總結哪些預定義的GLSL變量在覈心配置文件中消失了,哪些仍然存在。

在大多數情況下,從核心配置文件着色器中刪除了預定義的變量,這是將大部分固定功能管道從API中刪除的直接後果。有很多uniform變量反映了根本不存在的狀態。典型示例包括:

  • 固定功能轉換狀態(gl_ModelViewMatrix,gl_ProjectionMatrix等)。
  • 照明參數(gl_Light*)。
  • 材料參數(gl_Material*)。
  • 剪輯平面(gl_Clip*)。

類似地,接收固定功能頂點屬性的頂點着色器輸入消失了,因爲只有通用屬性在覈心配置文件中受支持。這些措施包括gl_Vertexgl_Normalgl_Color

這裏也曾經是一些預先定義的變量varyinggl_FrontColorgl_BackColorgl_TexCoord這都走了,並可以很容易地定義自己的out/in變量替換。

此外,還有預定義的片段着色器輸出gl_FragColorgl_FragData。這些都是一個有趣的案例,因爲原因不是功能棄用。我的理解是,它們被棄用,因爲它們不夠靈活以適應當前的功能。由於gl_FragColor的類型爲vec4,因此片段着色器的輸出必須是具有浮點組件的向量。如果您的渲染目標具有不同的類型,則此效果不佳。如果你正在渲染一個整數紋理。

那麼什麼預定義的變量仍然剩下?儘管比以前少了很多,但仍然有一些與可編程管線中仍然存在的固定功能有關。實例包括:

  • 的頂點座標的頂點着色器和片段着色器,它主要由在頂點着色器中的gl_Position輸出和在片段着色器的輸入gl_FragCoord之間接口。在頂點和片段着色器之間仍有許多固定的功能塊,如剪切和光柵化。這些固定的功能塊在頂點座標上運行,因此預定義的變量仍然有意義。
  • 一些與實例相關的變量(gl_VertexID,gl_InstanceID)。
  • gl_ClipDistance用於支持任意平面的裁剪,它仍然以固定的函數形式存在。
  • gl_FrontFacing。三角形的纏繞順序由固定功能評估,並可供片段着色器使用。

這些列表都不是很詳盡,但我希望它是一個有用的概述,並提供一些背景知識。一如既往,規格文件提供最終和完整的答案。

+2

感謝大家對他們的回答,他們真的爲我澄清了很多。 OpenGL是一個相當複雜的API,起初很多事情並不明顯。 – michy04

1

正如我們的同事剛纔所說的那樣,gl_Position不會被棄用。我剛剛購買了關於OpenGL 4.3的OpenGL Superbible第6版,並在第一頁(第18頁)中使用了此功能。

我只能推薦拿到這本書。它是由設計OpenGL的人寫的,它的確是教學。

我之前也失去了你,因爲我試圖通過互聯網或stackexchange學習,在得到這本書後,我與OpenGL度過了美好的時光。我認爲,在三週內我將學習的內容比從互聯網上學習5年還要值得。 OpenGL並不複雜,並不像許多人所說的那樣,只要你從本書中學習,就不會有任何「野獸」。如果你通過網絡學習它,我相信它不僅僅是一個野獸!

本書在beginnig上說,他不會教授任何不是核心OpenGL的東西,因此您可以確保不會遇到像您所做的那樣的陷阱。

你可以在亞馬遜購買這本書,價格便宜50美分。我只能推薦它!

+0

你試過回答這個問題嗎? – Qwertiy

+1

我認爲他做了,如果第一句話。然後證實我所懷疑的是,互聯網並不是理解陰影版本的OpenGL發生了什麼的充分資源。這是一個恥辱,因爲OpenGL有一個wiki。 –